C ++链表在删除具有重复值的节点时会出现分段错误

C++ Linked List gives Segmentation fault when removing nodes with duplicate values

对于一个排序的链表,比如1->1->1->1->2->2->3->3->4->4->4,我想删除所有重复项导致链表的每个节点都具有唯一值(即上面的链表应该变成1->2->3->4->.)

ListNode* deleteDuplicates(ListNode* A)
{
    ListNode *ptr = A, *nextt;

    if (A == NULL) 
        return A;

    if (A->next == NULL)
        return A;

    while (1)
    {
        if ((ptr == NULL) || (ptr->next == NULL))
            break;

        nextt = ptr->next;

        while ((ptr->val == nextt->val) && (nextt != NULL))
            nextt = nextt->next;

        ptr->next = nextt;
        ptr = ptr->next;
    }

    return A;
}

我的算法是:

  1. 一个指针ptr最初指向链表的头部。另一个Pointer 'nextt 指向从头开始的下一个节点。 (ptr->next).
  2. nextt的值与ptr保持不变,nextt指针向前遍历,直到值不同或nextt到达末尾列表。

但是,在 运行 代码中,我收到了一个分段错误。

当我们到达列表末尾时,内部 while 循环导致 nextt 变成 NULL。这是错误的地方吗?

在纸上模拟不同的输入也无济于事。我不确定错误在哪里。

谢谢。

问题是你的情况

while((ptr->val==nextt->val) && (nextt!=NULL))

取消引用 nextt 以访问 nextt->val。当 nextt 为 NULL 时,这是一个访问冲突。

将循环条件更改为:

while ((next != NULL) && (ptr->val == nextt->val))

因此,如果 next == NULL,则条件将短路并评估为 false。