[英]Linked List removing a node from certain position confusion
假設我們有以下鏈接列表: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?
}
謝謝!
要意識到的重要一點是,第一個代碼實際上並沒有“刪除節點 'd'”(就像名稱所暗示的那樣),而是刪除了值 d。
通過將值從下一個節點(在您的示例中為“ f”)復制到當前節點(先前包含“ d”的節點),然后刪除下一個節點(包含“ f”的節點)來完成此操作不再需要,因為我們在當前節點中有該值的副本。
a -> s -> d -> f
a -> s -> f -> f
a -> s -> f
我發現有些混亂,我個人將直接刪除節點“ d”,而無需移動任何內容。 我想,這樣做是為了更好地分離節點搜索和刪除。 如果您確實要刪除某個節點 (而不是其內容),則需要引用其先前的節點。 這可能會使接口復雜化。
正是由於這個問題,第二個代碼失敗了。 它嘗試刪除給定的節點-但是不能,因為刪除它意味着更新前一個節點的.next
成員,而我們無權訪問。 錯誤代碼中的語句僅更改了局部變量中的引用,這對實際列表沒有任何影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.