删除链接列表中项目的所有出现
Delete all occurrences of an item in a linked list
以下代码将项目作为参数作为参数,并删除链接列表中的所有事件。它与我的测试效果很好。有什么我缺少的吗?可以进一步改进此代码吗?
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;
}
相关文章:
- CMake 项目链接静态库
- 尝试使用 gradle 构建指向静态库的 c++ 项目链接时找不到头文件
- 将错误GoogleMock与我在linux下的C++项目链接
- 将OpenBLAS与Qt Creator项目链接
- 从大型 github 项目链接共享库
- 将TBB库与QTCreator与CMAKE项目链接
- 如何与Libm.so和libdl.so与我的Bazel项目链接
- 将C++项目与 Visual Studio 中的窗体项目链接
- GTEST测试项目链接链接到其他可执行文件
- Visual Studio,将项目链接在一起并进行测试
- 如何在Xcode4上从头开始构建C++项目-链接现有和新的外部库
- 我怎么能说视觉工作室将库与我的项目链接起来
- 添加类后项目链接错误
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- Netbeans/C++:将2个项目链接在一起(可执行文件/动态库)
- 裸机目标与cmake项目链接错误
- 使用lua lib的Xcode c++项目链接错误
- 试图从另一个项目链接类时出现链接器错误
- 如何将code::块设置为在目标链接器选项之前链接项目链接器选项
- 无法将一个项目的头和 CPP 文件与另一个项目链接 LNK2019:未解决的外部符号错误