删除链表中的重复项时指针错误



我想从链表中删除所有重复项。我知道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是0 xdddddddd .

如果这是一个愚蠢的问题,我很抱歉,但我刚刚开始在c++中使用数据结构。

dup = ptr2;
ptr2 = ptr2->next;
delete(dup);

删除一个Node

如果你回顾你的Node类,你会看到每个Node有一个next指针,链接到列表中的下一个节点。

上面的代码删除了实际的Node,但是它没有对链表中的next指针做任何操作。链表中前面的Node:它的next仍然指向这个Node。只需要deleteNode。它已经不存在了。试图使用和解引用之前的Nodenext,这是指向deleteNode变成未定义的行为。这一定是你崩溃的原因。

你需要更新你的逻辑,以便相应地更新链表中的next指针。

相关内容

  • 没有找到相关文章

最新更新