删除链表中的重复项

时间:2014-03-16 03:06:52

标签: c++ linked-list duplicates

void List::removeDup()
{
    Node *after = NULL;
    Node *dup = NULL;

    curr = head;

    while(curr->next != NULL)
    {
       after = curr->next; //node after current one
       while(after != NULL) 
       {
          if(curr->data == after->data) //if dup found
          {
             dup = after; 
             curr->next = after->next;
             delete dup;
          }
          else
          {
             after = after->next;
          }//if no dup found, advance after node
       }
          curr = curr->next; //advance curr node
    }
}

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

释放的指针未分配。有谁知道这意味着什么?

任何帮助将不胜感激

4 个答案:

答案 0 :(得分:2)

如果你在linux上尝试运行valgrind来查看内存中实际发生的事情

其次,您的代码存在问题: 如果找到重复内容,则会破坏链接列表

|当前| => |节点| => |节点| => |复制| => |下一页|

如果您发现重复,您的代码会使当前的下一个指向副本的下一个并且您将其全部打破

我认为您必须执行其他更简单的功能来删除列表中的1个元素,并在找到重复项时调用它

答案 1 :(得分:0)

我不太了解c ++,但我认为它是因为你永远不会分配dup。这可能会对您有所帮助:Deleting a pointer in C++

答案 2 :(得分:0)

我创造了这种简单而干净的方法。

我们的想法是检查当前节点的数据是否等于下一个节点的数据。

如果答案是肯定的,请跳过next one并删除它(取消分配)。

如果给定位置没有重复,只需像往常一样解析链表(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;
}

答案 3 :(得分:0)

我差不多做同样的操作:选择第一个,将它与以下项目进行比较,如果下面的任何项目重复,则断开其链接。等等...

这是我的实施:

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;
    }
}

预期输出为:

去除前:2,2,2,3,3,1,1,3,8,3,2,4,4

去除后:2,3,1,8,4