删除链表中的节点

Delete nodes in a linked list

本文关键字:节点 链表 删除      更新时间:2023-10-16

我知道有很多关于从链表中删除节点的问题。但是我的脑子卡在一个点上,我无法清除我的困惑。

我有一个链表,其中有节点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给了我访问冲突错误,我知道问题是,如果它在最后一个节点,它应该指向哪个节点!

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

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

试着在IF块中做下面的操作。

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

这是典型的c++初学者的错误,我敢打赌,当我写完这个答案时,会有很多答案告诉你如何删除指针(提示:先删除,然后取消——如果你需要的话)。

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

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),但列表的第一个元素是1。

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

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;
}

您的代码中有几个问题。如果第一个节点等于'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;
        }
    }
}

我用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