首页 > 解决方案 > 删除链接列表中的重复项时出现指针错误

问题描述

我想从链接列表中删除所有重复项。我知道 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++ 中的数据结构。

标签: c++pointersdata-structures

解决方案


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

这将删除其中一个Nodes。

如果您查看您的Node类中的内容,您会看到每个Node都有一个next指针,该指针链接到列表中的下一个节点。

上面的代码删除了实际的,但它对链表中的Node任何指针都不做任何事情。链表中next的前一个:它仍然指向 this 。你只是d这个。它不再存在。尝试使用和取消引用指向d的前一个's成为未定义的行为。这一定是你崩溃的原因。NodenextNodedeleteNodeNodenextdeleteNode

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


推荐阅读