对于排序后的链表,例如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;
}

我的算法是:
  • 指针ptr最初指向链接列表的头部。另一个Pointer的nextt指向从头开始的下一个节点。 (ptr->next)。
  • 虽然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。

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

    10-12 16:17