C++ 删除链接列表中的重复项

C++ 删除链接列表中的重复项,c++,linked-list,duplicates,C++,Linked List,Duplicates,此代码使用第一个节点,并与其余节点进行比较以查找重复的节点。如果找到,则会将其删除。我得到的错误是 未分配要释放的指针。有人知道这是什么意思吗 任何帮助都会被赏识我不知道C++,但是我认为它是因为你从不分配DUP。这可能会对您有所帮助:如果您在linux上,请尝试运行valgrind以查看内存中实际发生了什么 其次,您的代码存在问题: 当你发现一个重复的,你打破你的链表 |当前|=>|节点|=>|节点|=>|重复|=>|下一步| 如果你发现了一个复制品,你的代码会使当前的下一个点指向复制品的下一

此代码使用第一个节点,并与其余节点进行比较以查找重复的节点。如果找到,则会将其删除。我得到的错误是

未分配要释放的指针。有人知道这是什么意思吗


<>任何帮助都会被赏识

我不知道C++,但是我认为它是因为你从不分配DUP。这可能会对您有所帮助:

如果您在linux上,请尝试运行valgrind以查看内存中实际发生了什么

其次,您的代码存在问题: 当你发现一个重复的,你打破你的链表

|当前|=>|节点|=>|节点|=>|重复|=>|下一步|

如果你发现了一个复制品,你的代码会使当前的下一个点指向复制品的下一个点,然后你会破坏它


我认为您必须执行另一个更简单的函数来删除列表中的一个元素,并在发现重复元素时调用它。我创建了这个简单而干净的方法

其思想是检查当前节点的数据是否等于下一个节点的数据

如果答案是肯定的,则跳过下一个
并将其删除(取消分配)

如果给定位置没有重复项,只需像往常一样解析链表(
else
语句)


我几乎在做同样的操作:选择第一个,将其与以下项目进行比较,如果有任何以下项目重复,则断开其链接。等等

以下是我的实现:

Node* RemoveDuplicates(Node *head)
{
    if (head == nullptr) return nullptr;

    Node *curr = head;
    Node *aux;

    while (curr->next != nullptr) {
      if (curr->data == curr->next->data) {
          aux = curr->next->next;
          delete curr->next;
          curr->next = aux;
      }
      else {
          curr = curr->next;
      }  
  }
  return head;
}
模板
void LinkedList::removeDuplicates(){
节点*电流=头部;
while(当前){
节点*前进\头=当前->下一步;
节点*向前\尾部=当前;
while(前进头){
if(正向头->数据==当前->数据){
//找到重复项。
前进尾翼->下一步=前进尾翼->下一步;
}
其他的
前进尾翼=前进尾翼->下一步;
前进头=前进头->下一步;
}
当前=当前->下一步;
}
}
预期产出为:

拆卸前:2,2,2,2,3,2,1,3,8,3,2,4,4

拆卸后:2、3、1、8、4

Node* RemoveDuplicates(Node *head)
{
    if (head == nullptr) return nullptr;

    Node *curr = head;
    Node *aux;

    while (curr->next != nullptr) {
      if (curr->data == curr->next->data) {
          aux = curr->next->next;
          delete curr->next;
          curr->next = aux;
      }
      else {
          curr = curr->next;
      }  
  }
  return head;
}
template<typename T>
void LinkedList<T>::removeDuplicates() {
    Node<T> * current = head;
    while (current) {
        Node<T> * forward_head = current->next;
        Node<T> * forward_tail = current;
        while (forward_head) {
            if (forward_head->data == current->data) {
                // duplicated item found.
                forward_tail->next = forward_head->next;
            }
            else
                forward_tail = forward_tail->next;
            forward_head = forward_head->next;
        }
        current = current->next;
    }
}