2015-11-23 29 views
2

在編碼書中,我早先遇到了這個問題。將LinkedList節點設置爲空

「實施算法刪除單個鏈接列表中的節點,給定 只能訪問該節點。」

書中給出的解決方案是這樣的:

​​

這是一個很好的解決方案,當然,是O(1)。儘管如此,這本書在最後記錄了這一點。

「請注意,如果要刪除的節點是鏈接列表中的最後一個節點,則無法解決此問題」。

我在這裏錯過了一些明顯的東西嗎?爲什麼我不能只是說,檢查方法之前的方法來檢查n.next是否等於null,如果是,只需將n設置爲null並返回true?我有什麼理由不能這樣做?

回答

4

這段代碼真正在做的是將下一個節點複製到給定節點中。最終效果就好像當前節點被刪除,但實際上它只是被下一個節點覆蓋。

也就是說,說你在這個列表中刪除B

A -> B -> C -> D 

結果列表如下:

    +------+ 
A -> B(Ccopy) ---+ C -+-> D 

現在你不能做這個節點D因爲有沒有下一個要複製的節點。

爲什麼我不能只是說,檢查身體前的方法檢查n.next是否等於null,如果是,只需將n設置爲null並返回true?我有什麼理由不能這樣做?

n設置爲null將不會執行任何操作。 n只是對被刪除的列表節點的引用。如果您更改n,則實際上不會更改列表中的任何內容。例如,假設您想要刪除該列表中的D。它看起來像這樣:

   n 
       | 
       v 
A -> B -> C -> D 

如果設置n爲null,最終的結果是這樣的:

   n---> null 


A -> B -> C -> D 

注意:並沒有在名單上變。

在這種情況下刪除D的唯一方法是將C.next修改爲指向null。也就是說,你想這樣:

   +----> null 
A -> B -> C --+ D 

這需要修改C,雖然,在單鏈表,你有沒有簡單的方法來從D訪問C。您必須從列表的開頭搜索,直到找到節點x,例如x.next == D

2

所以假設你的最後一個節點n,與n-1(以前的節點)和p(參考最後一個節點)指向它:

[n - 1] --> [n] <-- p 

您所參考的p。並且您必須刪除節點n,由p指出。如果將p設置爲null,則不要取消引用[n - 1]指針。那仍然指向[n]節點。所以,這意味着,節點[n]並沒有真正從鏈接列表中分離出來。