Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除已排序链表中重复值的重复值_C++_Data Structures_Linked List - Fatal编程技术网

C++ 删除已排序链表中重复值的重复值

C++ 删除已排序链表中重复值的重复值,c++,data-structures,linked-list,C++,Data Structures,Linked List,删除重复超过1次的值后,我在打印排序的链接列表时遇到问题 代码: 这会删除多次出现的值,但对于多次出现的值,它不起作用,我无法找到原因 测试用例: 例如:如果输入是这样的: 4 6 1 2 2 3 3 4 7 1 1 1 1 1 1 1 5 2 3 3 4 6 1 10 1 2 3 4 1 2 3 4 6 10 然后它应该有如下输出: 4 6 1 2 2 3 3 4 7 1 1 1 1 1 1 1 5 2 3 3 4 6 1 10 1 2 3 4 1 2 3 4 6 10 但我的输出是:

删除重复超过1次的值后,我在打印排序的链接列表时遇到问题

代码:

这会删除多次出现的值,但对于多次出现的值,它不起作用,我无法找到原因

测试用例:

例如:如果输入是这样的:

4
6
1 2 2 3 3 4
7
1 1 1 1 1 1 1
5
2 3 3 4 6
1
10
1 2 3 4
1
2 3 4 6
10
然后它应该有如下输出:

4
6
1 2 2 3 3 4
7
1 1 1 1 1 1 1
5
2 3 3 4 6
1
10
1 2 3 4
1
2 3 4 6
10
但我的输出是:

1 2 3 4
1 1 1 1
2 3 4 6
10

这是你的代码的一个改进版本,我相信它运行起来不会有问题。我在开头添加了一个
NULL
检查,并修改了算法以正确处理重复项:

Node* RemoveDuplicates(Node *head)
{
    if (head == NULL)         // return NULL in case of empty list
        return NULL;

    if (head->next == NULL)   // return the head in case of list with only one element
        return head;

    Node *prev,*cur;
    prev = head;
    cur  = head->next;

    while (cur != NULL)
    {
        if (prev->data != cur->data) {
            prev->next = cur;
            prev = cur;    
            cur = cur->next;
        }
        else {
            Node* temp = cur;
            cur = cur->next;
            free(temp);       // delete a duplicate node
        }
    }

    prev->next = NULL;        // NULL-terminate the modified list

    return head;
}

这是一种可能的方法。基本思想是遍历列表,只要有下一个节点数据匹配,就从列表中剪掉下一个节点。我添加了一个
DeleteNode()
helper函数,它释放一个节点并返回它的旧
next
指针。此实用程序在其他上下文中很有用

Node* DeleteNode(Node *node)
{
    Node *ptr = node->next;
    delete node; // This is C++, you might need free() instead
    return ptr;
}

Node* RemoveDuplicates(Node *list)
{
    Node *node = list;
    while (node) {
        while (node->next && (node->data == node->next->data)) {
            node->next = DeleteNode(node->next);
        }
        node = node->next;
    }
    return list;
}

由于cur已释放,因此无法在中访问它。 您可以这样做:

Node* RemoveDuplicates(Node *head)
{
    if(head==NULL){
        return NULL;
    }
    Node *prev,*cur;
    cur=head;
    while(cur->next!=NULL)
    {
        prev = cur;
        cur = cur->next;
        if(prev->data == cur->data)
        {
            prev->next = cur->next;
            free(cur);
            cur = prev;
        }
    }
    return head;
}

C++使用代码> For()/<代码>?在您释放代码后,请访问<代码> Cur.<代码>,这不是一个好主意……您释放了<代码> Cur.<代码>,然后永远不更新指针指向后续节点。如果这是C++,您可能应该使用<代码>删除<代码>。您没有检查<代码>头<代码> <代码> null <代码>。哦,你说得对,它可能会抛出StEngEngult~~~谢谢~