如何在C ++中删除链表中的节点?

时间:2015-04-14 20:27:49

标签: c++ pointers linked-list nodes delete-operator

我到目前为止粘贴了我的作品: http://codepad.org/WhJuujRm

链接列表的概念让我大开眼界,所以我想我会练习。我知道如何添加节点和编辑节点,但我不知道如何在我的特定场景中删除节点。

我的伪代码:

previous == now - 1;
if(stdid == now->getID());
previous->setNext(now->getNext);
delete now;
return;

我怎么能实现这个?

3 个答案:

答案 0 :(得分:1)

这应该有用,但我没有测试过。

删除第一个节点时有一种特殊情况。第一次迭代时previous设置为NULL,在这种情况下必须调整top

我没有使用bottom,因为这不是我的方式。如果您使用bottom,则在删除最后一位学生时会有第二种特殊情况。我会将next指针设置为NULL来标记列表的末尾,因为这样可以消除这种特殊情况。

bool deleteStudent(int id)
{
    student* now = top;
    student* prev = NULL;
    while(now != NULL) {
        student* next = now->getNext();
        if(id == now->getID()) {
            delete now;
            if(prev) prev->setNext(next);
            else top = next;
            return true;
        }
        prev = now;
        now = next;
    }
    return false;
}

答案 1 :(得分:1)

从链表中删除元素时的思维方式是更新首先将元素带到元素的指针。在您的列表案例中,可能是top(和/或可能bottom),它可能是某个节点的next。当您使用cur指针遍历列表搜索时,请保留一个prev指针,在您枚举时向前推进一步。假设你找到了受害者节点(如果你没有,那就什么都不做,那就去!),prev将处于以下两种状态之一:

  • 它将为NULL,在这种情况下top是指向受害节点的指针,top必须更新,或者......
  • 它将是一个指向节点的指针,在这种情况下,节点的next成员需要更新以反映受害者节点的next成员值。< / LI>

两个案例bottom中也可能需要更新。在第一种情况下,如果列表只有一个节点并且您要删除它,则需要更改bottom。即完成后你将有一个空列表。很容易分辨,因为top在分离cur并将top设置为cur->next之后将为NULL。对您来说更容易,因为您在列表容器中保留了一个大小成员;如果是1,则您知道headbottom

在第二种情况下, last 节点可能是受害节点。在这种情况下,bottom必须更新以反映列表的新结尾(恰好在prev中,如果列表只有一个,则可能是NULL如何判断受害者是否是列表中的最后一个节点?如果next成员为NULL,则必须是最后一个节点,bottom 必须待更新。

这样的东西,一个基于ID搜索的删除功能

void deleteStudent(int id)
{
    student *cur = top, *prev = nullptr;
    while (cur && cur->getID() != id)
    {
        prev = cur;
        cur = cur->getNext();
    }

    // found a node?
    if (cur)
    {
        student *pNext = cur->getNext();

        // set new next pointer for prev, or new top
        if (prev)
            prev->setNext(pNext);
        else
            top = pNext;

        // update bottom if needed
        if (!pNext)
            bottom = prev;

        delete cur;
        --scnt;
    }
}

我留给您的其他删除选项和条件。

祝你好运。

答案 2 :(得分:0)

我没有使用你的符号,但我认为你可以明白这一点。

prev = NULL;
current = top;
while (current != NULL && !isfound(current)){
    prev = current;
    current = current->next;
}
// current point to the element you want to delete (if not NULL)
if(current != NULL) {
    if(previous != NULL) {
        previous->next = current->next;
    }
    else {
        top = current->next;
    }
    delete current;
}