2016-07-16 54 views
2

刪除重複例如:從排序清單

  • 鑑於1→ 1→ 2,返回1→ 2。
  • 鑑於1→ 1→ 2→ 3→ 3,返回1→ 2→ 3。

我的問題是爲什麼返回的對象是head但不是node?爲什麼node.next意味着節點遍歷移動到下一個節點?我很困惑:

public class Solution { 
    public ListNode deleteDuplicates(ListNode head) { 
     if(head == null) 
      return null; 
     ListNode node = head; 
     while(node.next != null) { 
      if(node.val == node.next.val) { 
       node.next = node.next.next; 
      } else { 
       node = node.next; 

      } 
     } 
     return head; 
    } 
} 
+0

注意此實現只支持在列表中彼此相鄰的副本 –

+0

deleteDuplicates()返回頭部,因爲從頭部可以訪問整個列表。從任何其他節點你可能無法(除非它是一個雙向鏈表),但即使你可以,如果你知道你的出發點在哪裏,最簡單的工作就是列表。 – LarsH

+2

@GregHilston:如果它是一個排序列表,那麼重複必須彼此相鄰,不是嗎? – LarsH

回答

2

爲了幫助理解,我將用字母后綴來表示不同的實例,例如如果原始列表是1→1→1→2→2→3→3,那麼這將是1a→1b→1c→2a→2b→3a→3b

目標是刪除重複項,如下:

開始在頭:node = head

↓ 
1a→1b→1c→2a→2b→3a→3b 

刪除1B:node.next = node.next.next

↓ 
1a→1c→2a→2b→3a→3b 

刪除1C:node.next = node.next.next

向前移動:node = node.next

↓ 
1a→2a→2b→3a→3b 

刪除2B:node.next = node.next.next

↓ 
1a→2a→3a→3b 

向前移動:node = node.next

 ↓ 
1a→2a→3a→3b 

刪除3B:node.next = node.next.next

 ↓ 
1a→2a→3a 

退出循環:node.next != null
返回更新列表:head

↓ 
1a→2a→3a 

正如你所看到的,node.next = node.next.next實際上並沒有打動你的前進,但確實進步你一步到你的目標。

您必須返回head,否則你只是返回的最後一個節點,即

↓ 
3a 

,你不希望出現這種情況。

+0

感謝這麼多的解釋細節。頭和節點被定義爲ListNode類型意味着他們需要指向Class內存或其他用途?下一個代表下一個節點,並可以移動到列表的「下一個」內存位置?謝謝 – HelenWang

+0

@HelenWang不完全理解你的評論。在'node = head'之後,'node'變量引用節點「1a」,如↓箭頭所示。節點「1a」具有值「1」,節點「下一個」由節點「1a」和節點「1b」之間的→箭頭表示,即由「節點.next」引用的對象*爲節點「1b」 ,它的值也是'1'。 'node.next.next'由節點「1b」和節點「1c」之間的→箭頭表示,即'node.next.next'所引用的對象*爲節點「1c」。代碼'node.next = node.next.next'然後更新「1a」來引用「1c」而不是「1b」。 – Andreas

0

該函數返回一個列表;列表由頭節點表示。至於關於node.next的一點:因爲這是它設計的目的。