這是一個相當簡單的問題,但我很困惑:從約束鏈表中刪除元素
給定一個單向鏈表,編寫一個函數來刪除一個給定的節點。
1)它必須接受指向開始節點的指針作爲第一個參數,並刪除節點作爲第二個參數,即指向頭節點的指針不是全局的。 2)它不應該返回指向頭節點的指針。 3)它不應該接受指向頭節點的指針。
Java中的解決方案如下:
void deleteNode(Node node, Node n) {
if (node == n) {
if (node.next == null) {
System.out.println("There is only one node. The list "
+ "can't be made empty ");
return;
}
node.data = node.next.data;
n = node.next;
node.next = node.next.next;
System.gc();
return;
}
// When not first node, follow the normal deletion process
// find the previous node
Node prev = node;
while (prev.next != null && prev.next != n) {
prev = prev.next;
}
if (prev.next == null) {
System.out.println("Given node is not present in Linked List");
return;
}
prev.next = prev.next.next;
System.gc();
return;
}
我很困惑,爲什麼在刪除頭節點,我們不修改頭指針,但複製的區域,而不是(更改內容)但是在刪除其他節點時,只是簡單地使用prev.next = prev.next.next
如果我們只是在刪除頭節點時做head = head.next
,它會起作用嗎?
謝謝!
非常感謝!我明白了,因爲head不能作爲全局指針傳遞,所以改變局部變量不會做任何事情。我認爲代碼的另一個問題是系統。GC()。我覺得這不是非常必要,C語言中的邏輯比Java中的更好。你能指出什麼是刪除節點的典型方法嗎? – AngieCris
此外,我很困惑爲什麼刪除頭部我們需要將所有內容從頭到尾移動,但是當刪除中間節點時,'prev.next = prev.next.next'就會起作用。 – AngieCris
@AngieCris好的我會在文中回答這兩個問題 – sprinter