2017-10-07 117 views
0

我很难理解下面的这个方法如何删除链接列表中的重复项。调用此方法后,所有重复项都被成功删除。为什么头不是零?由于方法中的当前变量迭代到最后,头节点不会为空。此方法如何成功更新列表以摆脱重复项目?链接列表删除列表中的重复,参考混淆

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

} 
+0

如果用户回答您的问题,请接受他的回答([接受答案:它是如何工作的?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作))。如果不是,请说明还没有答案,这是StackOverflow非常重要的一部分,非常感谢。 – Zabuza

回答

0

元素,会从一个元素改变指针指向下一个元素删除。这就是你如何通过跳过LinkedList来移除元素。垃圾收集器稍后将删除该对象,因为没有对象再次引用它。

这里是去除的图示:

Illustration


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


head不能得到null,因为它不是null以前和副本只能在第一个元素后发生,因为你需要遇到一个元素至少一次,直到你可以找到一个副本。例如,像[1, 1, 1]这样的列表被修改为[1]而不是[]

另外变量head在方法中没有改变,它指向方法前后的头节点。看起来你被current = head弄糊涂了,但是你需要知道这个,在Java中,没有同步这两个变量。如果方法更改current,则此更改为而不是head反映。该陈述仅意味着'current指向head',然后您让current指向其他地方。

+0

我明白这一点。但是,即时通讯有什么问题,是'node current = head'。在while循环中,我们迭代直到当前为空。在循环结束时,脑袋也会变得虚无? – Person

+0

'current == null'表示我们到达列表的末尾,**尾部**。 'current = head'意味着我们从头开始。它不会将'head'连接到'current',这样'current'上的变化也会影响'head'。 'head'本身不会被该方法'null',因为它不能是重复的,重复只能发生在第一个元素(它是'head')之后。类似'[1,1,1,1]'的列表在方法之后看起来像'[1]',而不是'[]'。 – Zabuza

+0

为什么倒票? – Zabuza