删除链接列表中项目的所有出现

Delete all occurrences of an item in a linked list

本文关键字:项目 链接 列表 删除      更新时间:2023-10-16

以下代码将项目作为参数作为参数,并删除链接列表中的所有事件。它与我的测试效果很好。有什么我缺少的吗?可以进一步改进此代码吗?

void
LinkedList::DeleteAllOccurences(int key) {
   Node *temp = head;
   Node *prev = head;
   while(temp!=NULL) {
      if(temp->item == key){
         if(temp == head) {
            head = temp->next;
            delete temp;
            temp = head;
         } else {
            prev->next = temp->next;
            delete temp;
            temp = prev->next;
         }
      } else {
         prev = temp;
         temp = temp->next;
      }
   }
   return;
}

我相信您的代码有一个错误。删除head节点时,prev未正确更新(即)它仍然指向删除 head节点。

我已经注释了您的代码并应用了修复程序[请原谅免费样式清理]:

void
LinkedList::DeleteAllOccurences(int key)
{
    Node *temp = head;
    Node *prev = head;
    while (temp != NULL) {
        if (temp->item == key) {
            // NOTE/BUG: after this, prev will _still_ be pointing to the
            // _deleted_ head node
            // NOTE/FIX: to fix this, prev must be set to the _updated_ head
            // node
            if (temp == head) {
                head = temp->next;
                // NOTE/FIX: add this:
#if 1
                prev = head;
#endif
                delete temp;
                temp = head;
            }
            else {
                prev->next = temp->next;
                delete temp;
                temp = prev->next;
            }
        }
        else {
            prev = temp;
            temp = temp->next;
        }
    }
    return;
}

May 也是另一个错误。而且,我认为有一种简化事情的方法。因此,进行比较:

void
LinkedList::DeleteAllOccurences(int key)
{
    Node *temp;
    Node *prev = NULL;
    Node *next;
    for (temp = head;  temp != NULL;  temp = next) {
        next = temp->next;
        if (temp->item != key) {
            prev = temp;
            continue;
        }
        if (prev != NULL)
            prev->next = next;
        else
            head = next;
        delete temp;
    }
}

另一种方法是使用std::list<>并让其完成所有繁重的举重。以下是适合您需要的示例实现:

#include <list>
#include <iostream>
using namespace std;
int main()
{
    // Create a list.
    list<int> myList;
    // Add some numbers: 2, 3, 2, and 5.
    myList.push_back(2);
    myList.push_back(3);
    myList.push_back(2);
    myList.push_back(5);
    // Print the contents of the list.
    // Will output 2, 3, 2, 5.
    for(auto item : myList)
        cout << item << endl;
    // Remove all numbers equal to 2.
    myList.remove(2);
    // Print the contents of the list.
    // Will output 3 and 5.
    for(auto item : myList)
        cout << item << endl;
    return 0;
}