【问题标题】:removing duplicates in a linked list删除链表中的重复项
【发布时间】:2014-03-16 03:06:52
【问题描述】:
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
    }
}

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

被释放的指针未被分配。有谁知道这是什么意思?

任何帮助将不胜感激

【问题讨论】:

    标签: c++ linked-list duplicates


    【解决方案1】:

    如果您使用的是 linux,请尝试运行 valgrind 以查看内存中实际发生的情况

    其次,您的代码有问题: 当您找到重复项时,您会破坏您的链表

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

    如果您发现重复,您的代码会将当前的下一个指向重复的下一个,然后您将其全部破坏

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

    【讨论】:

      【解决方案2】:

      我创建了这个简单而干净的方法。

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

      如果答案是肯定的,请跳过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】:

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

        【讨论】:

          【解决方案4】:

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

          这是我的实现:

          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、2、3、2、1、3、8、3、2、4、4

          删除后:2、3、1、8、4

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 2017-08-22
            • 2011-08-18
            • 1970-01-01
            相关资源
            最近更新 更多