我想从链表中删除所有重复项。我知道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
。只需要delete
和Node
。它已经不存在了。试图使用和解引用之前的Node
的next
,这是指向delete
的Node
变成未定义的行为。这一定是你崩溃的原因。
你需要更新你的逻辑,以便相应地更新链表中的next
指针。