关于链表的问题

时间:2016-01-07 02:37:01

标签: c algorithm

这是关于删除一个链表的节点的功能,接下来是代码。

//delete List
int deleteList(PNODE pHead,int pos)
{
    int i=0;
    PNODE p=pHead->pNext;
    //locate the position
    while(p!=NULL && i<pos-1)
    {
        p=p->pNext;
        i++;
    }
    if(i>pos-1 || p==NULL)
    {
        return 0;
    }
    PNODE q=p->pNext;
    p->pNext=q->pNext;
    free(q);
    return 1;
}

我不知道以下代码是否有实际用途:

if(i>pos-1 || p==NULL)
{
     return 0;
}

3 个答案:

答案 0 :(得分:0)

您可以通过放弃i上的检查来修改确定是否尝试拼接的条件。您的算法已经将p指针正确放置在要拼接的节点之前的节点上。如果p都不为空并且在拼接出来之后存在一个节点,您只想采取行动。

if (p==NULL || p->pNext==NULL)
{
    return 0;
}
else
{
    PNODE q=p->pNext;
    p->pNext=q->pNext;
    free(q);
    return 1;
}

答案 1 :(得分:0)

以下是对代码的逐个解释。

1

int i=0;
PNODE p=pHead->pNext;

这会设置变量。我是索引来跟踪我们在链表中的位置,p是跟踪我们在链表中的节点。

2

while(p!=NULL && i<pos-1)
{
    p=p->pNext;
    i++;
}

这会遍历列表,直到它到达结尾(意味着传入的位置超出列表范围)或者它到达我们要删除的节点的位置(减1)。此时,我将成为pos - 1(我们要删除的元素的位置 - 1),并且p将成为我们要删除的节点之前的元素。

3

if(i>pos-1 || p==NULL)
{
    return 0;
}

此代码检查我们是否确实在我们要查找的列表中找到了位置 - 如果我们在到达pos之前用完了列表项,那么我们就不应该做任何事情。基本上,如果第2步到达列表的末尾而没有到达pos-1,那么我们不想尝试删除任何内容,因为我们已经不在列表的末尾。

4

PNODE q=p->pNext;
p->pNext=q->pNext;
free(q);
return 1;

这是实际从列表中删除内容的代码。现在,p是我们要删除的节点之前的节点(我们在步骤2中将p设置为此节点)。因此,我们获取要删除的节点,并将其放在q PNODE q=p->pNext;

在我们删除q之前,我们必须将链接列表重新组合在一起,因此我们必须将p的下一个节点设置为q的下一个节点p->pNext=q->pNext;。基本上,如果我们有一个链接列表o->p->q->r,我们只需将其更改为o->p->r。一旦我们有了这个集合,我们就准备好删除q并返回成功。

答案 2 :(得分:0)

没有对参数进行健全性检查。其中一半是检查是否已传入负数,另一半是检查您是否未读过列表末尾。

如果你想要完全安全,你应该在取消引用它的成员之前检查pHead是否为空。