c++ - 删除链接列表中的重复项时出现指针错误
问题描述
我想从链接列表中删除所有重复项。我知道 GeeksForGeeks 上有一个与我的非常相似的确切程序,我可以使用它,但我想了解为什么我的程序不起作用。
代码:
class Node {
public:
int data;
Node *next;
};
void removeDuplicatesAlpha(Node* start)
{
Node* ptr1 = start;
Node* ptr2 = NULL;
Node* dup = NULL;
int i = 0;
/* Pick elements one by one */
while (ptr1 != NULL && ptr1->next != NULL)
{
ptr2 = ptr1->next;
//0 1 2 3 4
/* Compare the picked element with rest
of the elements */
while (ptr2 != NULL && ptr2->next != NULL)
{
cout << i;
i++;
/* If duplicate then delete it */
if (ptr1->data == ptr2->data)
{
/* sequence of steps is important here */
dup = ptr2;
ptr2 = ptr2->next;
delete(dup);
}
else /* This is tricky */
ptr2 = ptr2->next;
}
ptr1 = ptr1->next;
}
}
int main()
{
Node* head = NULL;
push(&head, 3);
push(&head, 3);
push(&head, 20);
push(&head, 14);
push(&head, 9);
push(&head, 20);
push(&head, 20);
printList(head);
//removeDuplicates(head);
removeDuplicatesAlpha(head);
printList(head);
deleteList(&head);
return 0;
}
我最后打印的是 4。
这是错误:抛出异常:读取访问冲突。 ptr2是 0xDDDDDDDD。
如果这是一个愚蠢的问题,我很抱歉,但我刚刚开始使用 C++ 中的数据结构。
解决方案
dup = ptr2;
ptr2 = ptr2->next;
delete(dup);
这将删除其中一个Node
s。
如果您查看您的Node
类中的内容,您会看到每个Node
都有一个next
指针,该指针链接到列表中的下一个节点。
上面的代码删除了实际的,但它对链表中的Node
任何指针都不做任何事情。链表中next
的前一个:它仍然指向 this 。你只是d这个。它不再存在。尝试使用和取消引用指向d的前一个's成为未定义的行为。这一定是你崩溃的原因。Node
next
Node
delete
Node
Node
next
delete
Node
您将需要更新您的逻辑,以便相应地更新next
链表中的指针。
推荐阅读
- python - 在没有 y 坐标的 Matplotlib 图中添加文本
- javascript - 根据数组对象数据创建一个新数组
- date - 两个日期之间的序列,仅按指定的工作日,跳过所选的周数
- c++ - 如何为这个函数制作 lambda?
- node.js - “gulp serve”正在返回我无法将 Web 部件添加到的 workbench.html
- batch-file - 许多启动命令在同一个窗口中批处理
- javascript - innerHTML 赋值删除空标签中的所有(包括最后一个)空格
- python - 我可以在我的 android 应用程序中包含 linux 可执行文件吗?
- python - 无法从其他文件导入函数名称
- javascript - Disable and enable button by over or under age 18 Javascript