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

标签 c++ pointers linked-list segmentation-fault

对于排序的链表,比如 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 'next 指向从头部开始的下一个节点。 (ptr->next).
  2. next 的值与 ptr 保持相同时,向前遍历 next 指针,直到值不同或 next 到达列表末尾。

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

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

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

谢谢。

最佳答案

问题是你的情况

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

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

将循环条件更改为:

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

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

关于C++链表在删除具有重复值的节点时会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31149357/

相关文章:

c++ - 从 C++ 函数返回字符串到 VB .Net

c - 指针的地址等于指向指针的指针?

java - 链表toUppercase方法返回类型错误

java - 成对交换节点

java - 如何将链接列表中的下一个元素打印到 CSV 文件?

c++ - 成员指针和静态变量

c++ - 我应该在高度动态的系统中使用优先级队列来调度任务(功能等)吗?

c++ - 现代 OpenGL + SDL2 三角形未显示

C 指针和动态分配

c - 通过地址访问C中的位域