2014-02-20 115 views
1

如果您的目標是編寫一個函數來刪除單向鏈接列表中的節點,並且您只能訪問要刪除的節點(而不是指定的節點),爲什麼不能我的解決方案工作從單個鏈接列表中刪除節點

我的解決辦法:

public void deleteNode(Node n) { 
    n = n.next; 
} 

本書的解決方案:

public void deleteNode(Node n) { 
    n.data = n.next.data; 
    n.next = n.next.next; 
} 

在我看來,這僅僅是爲了n.next分配n取在一行分配數據和指針的照顧。

+1

本書的解決方案存在固有的弱點。跟蹤'last'元素是不可能的,因爲移除最後一個元素需要全部遍歷才能將引用重置爲'last'元素。因此,無論是追蹤最後一個元素的引用,並在每次刪除最後一個元素時執行完整列表遍歷,或者不追蹤最後一個元素,並且每次將元素添加到列表的末尾時執行完整遍歷。伊克。 –

+0

是的,這實際上並不是本書解決方案的全部內容。我剛剛發佈了我有一個問題的部分。 –

回答

2

這是一個容易犯的錯誤,因爲在獲得關於鏈表操作的良好心理模型之前。 deleteNode被給予您想要刪除的節點的引用。它將該參考存儲在變量n中,該變量設置爲只有用於使用deleteNode代碼。在您的解決方案中,deleteNoden的值更改爲指向列表中的下一個節點,但這隻影響n,一旦執行到達deleteNode的末尾,該值就會被丟棄。鏈表仍然存在,就像deleteNode執行前一樣。換句話說,要刪除的節點之前的節點仍指向與您在輸入deleteNode時所做的節點相同的節點,並且應該刪除的節點仍然指向該行中的下一個節點。更改n沒有效果。

然而,本書的解決方案的確會改變一些東西。運行後,現在應該刪除的節點包含數據和下一個指向下一個節點的指針。這會有意識地將下一個節點的內容「轉移」到一個。

+0

但這本書的解決方案不是這樣嗎? –

+0

增加了更多的細節,希望有所幫助。使用鏈接列表通常有助於繪製出來。你試過了嗎? –

+0

,所以本書的解決方案改變了參考文獻'n'中的'n.data'和實際節點? –

1

所有節點都在內存中的某個位置,每個節點都知道在哪裏找到下一個節點
(與代碼中的變量無關,即沒有「n」或類似的東西)。
此外,每個節點可能有一個或多個變量「指向」內存中該節點的 。您的方法中存在的問題是,您只有
更改了您的易碎n的目標,而不是節點本身。

如果你有值A,B,C,d 4個節點,並希望刪除B,你的變量n點B.
在你的方法分配後,正將指向C,
但4個節點本身將保持不變。
書本解決方案的確改變了B本身的價值和其下一個...