2015-09-20 51 views
1

所以我們可以說我們有這個鏈表:a-> s-> d - > f,我們想刪除d。鏈接列表從某個位置混淆中刪除一個節點

我無法理解下面的代碼爲什麼會正確地從鏈接列表中刪除一個項目,以及爲什麼下面的代碼不會產生相同的結果?

正確的代碼:

public void deleteNode(ListNode node) { 
    node.val = node.next.val; 
    node.next = node.next.next; 
} 

錯誤代碼:

public void deleteNode(ListNode node) { 
     node = node.next;//d now points to f 
     //So wouldn't node s.next now equal f 
     //because we have changed what node d references to? 
} 

謝謝!

回答

0

認識到的重要一點是,第一個代碼實際上並沒有「刪除節點‘d’」(好像是這個名字所暗示的),而是刪除 d。

它通過將下一個節點(示例中的「f」)的值複製到當前節點(之前包含「d」的節點),然後刪除下一個節點(包含「f」 ),因爲我們有當前節點中的值的副本,所以不再需要它。

a -> s -> d -> f 
a -> s -> f -> f 
a -> s -> f 

我覺得有點混亂,我個人會直接刪除節點「d」,而不移動任何內容。我想,這樣做是爲了更好地分離節點搜索和刪除。如果您實際上想要刪除某個節點(而不是其內容),則需要參考其之前的節點節點。這可能會使界面複雜化。

第二個代碼正是因爲這個問題而失敗。它試圖刪除給定節點 - 但它不能,因爲刪除它意味着更新前一個節點的.next成員,我們無法訪問它。不正確的代碼中的語句只是更改本地變量中的引用,該變量對實際列表沒有任何影響。