【问题标题】:Removing duplicate nodes from a sorted linkedlist with a simple code使用简单的代码从排序的链表中删除重复节点
【发布时间】:2018-03-26 11:04:27
【问题描述】:

我正在尝试编写一种方法来从排序的链表中删除重复节点。如果该方法获取输入链接列表: 1->1->2->2->3->3 它应该使链接列表类似于 1->2->3 。但问题是它返回 1->1->2->3 这意味着第一个重复元素未确定!这是我的代码:

void removeDuplicates(Node head)
{
  Node* Current = &head;
  while(Current != NULL && Current->next != NULL)
  {
    while(Current->next != NULL && Current->next->info == Current->info)
        Current->next = Current->next->next;

    Current=Current->next;
  }
}

已添加完整代码:https://paste.ubuntu.com/p/hstGyDJrkN/

【问题讨论】:

  • the_list.erase(std::unique(the_list.begin(), the_list.end()), the_list.end()); 将是“从排序的链表中删除重复节点”的常用解决方案。见std::unique
  • 你注意到 head 是一个指针了吗? leetcode.com/problems/remove-duplicates-from-sorted-list/…
  • 顺便说一句,你只是“忘记”了你想从列表中删除的节点,你没有删除对象,它的内存泄漏
  • std::unique 可以工作,如果节点是通过引用而不是指针传递并提供了额外的增量和比较运算符 - 也可能是赋值,在给定的情况下最好是移动赋值......

标签: c++ singly-linked-list


【解决方案1】:

您按值传递 head,因此您创建了 head Node 的副本,并更改​​了副本的下一个字段,而不是原始的 head 指针。你应该通过引用传递指针,所以你的签名应该看起来像

void removeDuplicates(Node* &head)

所以你将修改实际的头指针

【讨论】:

  • 发帖前你测试了吗?
【解决方案2】:

另一种方法是使用 c++ 算法

std::独特

如图所示 http://en.cppreference.com/w/cpp/algorithm/unique

你只需要提供一个好的

二元谓词

如果元素应该被视为相等则返回真。 谓词函数的签名应该等价于:

bool binaryPredicate(const  Node& a, const  Node& b);

【讨论】:

  • std::unique 将增加指针,但这可能会产生与pointer = pointer->next 不同的结果;所以我们需要一些额外的工作来解决这个问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2022-01-07
  • 2020-08-11
  • 2014-08-15
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
相关资源
最近更新 更多