2017-10-07 201 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