删除链接列表中的节点

时间:2015-09-10 20:21:20

标签: c++ singly-linked-list

我知道有很多关于从链表中删除节点的问题。但是我的思绪陷入了困境,我无法清除我的困惑。

我有一个包含节点1,2,2的链表。我想从中删除2的节点。我的代码只删除2的第一个节点而不是第二个节点。简而言之,我想删除与用户提供的密钥匹配的所有节点。这是我的代码:

void LinkedList::Delete(int key)
{
    if(head == 0)
        return;
    if(head->data == key)
    {
        Node *p = head;
        head = head->next;
        delete p;
    }
    else
    {
        Node *prev = 0;
        Node *temp = head;
        while(temp!=0)
        {
            if(temp->data == key)
            {
                Node *q = temp;
                temp = temp->next;
                prev = temp;
                delete q;
            }
            else
            {
                prev = temp;
                temp = temp->next;
            }
        }

    }
}

如果我注释掉else部分,那么它会在最后一行即temp=temp->next给出访问冲突错误,我知道问题是它应该指向哪个节点最后一个节点!

5 个答案:

答案 0 :(得分:1)

在下面的代码中,删除后,你的temp没有指向下一个节点。因此,一旦删除第一个“2”条目,您的循环就会停止。

 if(temp->data == key)
        {
            prev->next = temp->next;
            temp = 0;
            delete temp;
        }

尝试在IF块中进行以下操作。

 itemToDelete = temp;
 temp = temp->next;
 delete itemToDelete;

答案 1 :(得分:1)

这是非常典型的C ++初学者的错误,我打赌当我输入这个答案的时候会有答案的音调向你展示如何删除指针(提示:先删除,然后取消) - 如果你需要)。

为了完整起见,您可以避免检查prev指针并使用指向指针来简化代码。 See here for details

void LinkedList::Delete(int key)
{
    for (Node** pp = &head; *pp; pp = &(*pp)->next)
    {
        Node* p = *pp;
        if (p->data == key)
        {
            *pp = p->next;
            delete p;
        }
    }
}

答案 2 :(得分:0)

您的代码中存在一些问题。如果第一个节点等于'2' - 则只删除第一个节点。为什么要为Node *prev分配内存?你有内存泄漏(见评论)。

您可以尝试以下代码:

void LinkedList::Delete(int key)
{
    if (head == 0)
        return;

    Node* prev = 0;
    Node* cur = head;
    while (cur != 0)
    {
        if (cur->data == key)
        {
            Node* temp = cur;
            if (prev == 0)
                head = cur->next;
            else
                prev->next = cur->next;
            cur = cur->next;
            delete temp;
        }
        else
        {
            prev = cur;
            cur = cur->next;
        }
    }
}

答案 3 :(得分:0)

您的代码没有删除任何内容,因为您没有浏览列表。您只是检查第一个元素是否等于键(2),但列表的第一个元素是1.

如果您希望删除其键==函数参数键的每个节点,则需要遍历整个列表。

node* current_node{ head };
while (current_node)
{
    node* next{ current_node->next };
    if (current_node->key == key)
    {
        // This operation should take care of properly managing pointers
        // in the linked list when a node is erased.
        erase(current_node);
    }
    current_node = next;
}

答案 4 :(得分:-2)

我用Turbo C ++编译器编写。它运作正常。

//start deleteEnd code
void deleteEnd()
{
    if (first == NULL)
    {
        cout<<"No list Available";
        return;
    }
    next = first;
    while (next->add != NULL)
    {
        cur = next;
        next = next->add;
    }
    cur->add=NULL;
}
//deleteEnd