C++ C++;删除具有重复值的节点时,链表会导致分段错误

C++ C++;删除具有重复值的节点时,链表会导致分段错误,c++,pointers,linked-list,segmentation-fault,C++,Pointers,Linked List,Segmentation Fault,对于排序后的链表,比如说1->1->1->1->2->2->3->3->4->4,我想删除所有重复项,使链表中的每个节点都具有唯一的值(即,上面的链表应该变成1->2->3->4->) 我的算法是: 指针ptr最初指向链表的头部。另一个指针“nextt指向头部的下一个节点。(ptr->next) 当nextt的值保持与ptr相同时,nextt指针向前移动,直到值不同或nextt到达列表末尾 但是,在运行代码时,我收到一个分段错误 当我们到达列表的末尾时,内部while循环会导致nextt 变为N

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

我的算法是:

  • 指针
    ptr
    最初指向链表的头部。另一个指针“
    nextt
    指向头部的下一个节点。(
    ptr->next
  • nextt
    的值保持与
    ptr
    相同时,
    nextt
    指针向前移动,直到值不同或
    nextt
    到达列表末尾
  • 但是,在运行代码时,我收到一个分段错误

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

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


    谢谢。

    问题是你的状况

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

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

    将循环条件更改为:

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


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

    问题在于您的条件

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

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

    将循环条件更改为:

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


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

    Yes。这就解释了。非常感谢。:-)对这就解释了。非常感谢。:-)
    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;
    }