【问题标题】:Linked List removing duplicate from list, reference confusion链接列表从列表中删除重复项,引用混淆
【发布时间】:2017-10-07 22:20:23
【问题描述】:

我无法理解以下此方法如何删除链接列表中的重复项。调用此方法后,成功删除所有重复项。为什么头部不为空?头节点不会为空,因为方法中的当前变量迭代到最后。此方法如何成功更新列表以消除重复项?

 static void removeDuplicate(node head) 
{
    // Hash to store seen values
    HashSet<Integer> hs = new HashSet<>();

    node current = head; 
    node prev = null;
    while (current != null) 
    {
        int curval = current.val;

         // If current value is seen before
        if (hs.contains(curval)) {
            prev.next = current.next;
        } else {
            hs.add(curval);
            prev = current;
        }
        current = current.next;
    }

}

【问题讨论】:

  • 如果用户回答了您的问题,请同时接受他的回答 (Accepting Answers: How does it work?)。如果不是,请说明什么仍未得到答复,这是 StackOverflow 的一个非常重要的部分,非常感谢。

标签: java data-structures linked-list


【解决方案1】:

通过将指针从上一个元素更改为指向下一个元素来删除元素。这就是你如何通过跳过它们来删除LinkedLists 中的元素。垃圾收集器稍后将删除该对象,因为不再有对象引用它。

这是删除的说明:


通过在HashSet 中记住每个遇到的值来识别重复项。如果您发现一个已经遇到过(即包含在集合中)的元素,则它是一个重复。


head 不能得到null,因为它以前不是null,并且重复只能出现在第一个元素之后,因为你需要至少遇到一个元素直到你可以找到重复的。例如像[1, 1, 1] 这样的列表被修改为[1] 而不是[]。

变量head在方法中也没有改变,它指向方法前后的头节点。您似乎对current = head 感到困惑,但您需要知道,在Java 中,这不会同步两个变量。如果方法更改current,则此更改不会由head 反映。该语句只是意味着'让current 指向head 指向的位置',然后让current 指向其他地方。

【讨论】:

  • 我明白这一点。但是,我遇到的问题是“节点当前=头”。在 while 循环中,我们迭代直到 current 为空。在循环结束时 head 也不会为空吗?
  • current == null 表示我们到达了列表的末尾,即tail。 current = head 表示我们从头开始。它不会将head 链接到current,因此current 上的更改也会影响head。通过该方法,head 本身永远不会是null,因为它不能重复,重复只能出现在第一个元素(即head)之后。像[1, 1, 1, 1] 这样的列表在方法之后看起来像[1],而不是[]。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多