[英]LinkedList - Trying to understand implementation
我正在學習解決復雜的算法。 為此,我遇到了LinkedList的實現。 我試圖了解上述解決方案。 在appendToTail中,我不了解while循環以及while循環之后的行。 在deleteNode中,我看不到該節點被刪除的位置。
class Node {
Node next = null;
int data;
public Node(int d) {
data = d;
}
void appendToTail(int d) {
Node end = new Node(d);
Node n = this;
while (n.next != null) {
n = n.next;
}
n.next = end;
}
Node deleteNode(Node head, int d) {
Node n = head;
if (n.data == d) {
return head.next; /* moved head */
}
while (n.next != null) {
if (n.next.data == d) {
n.next = n.next.next;
return head; /* head didn’t change */
}
n = n.next;
}
}
}
好了,這里有兩種情況需要考慮:首先,當節點在列表中的第一個時。 然后,磁頭僅移動到下一個節點,而第一個節點不再是列表的一部分。
在第二種情況下,我們只是逐個節點遍歷整個列表。 如果我們到達需要刪除其下一個節點的節點(通過if語句檢查),則將其更改為將刪除的節點之后的節點保留為下一個節點(if語句的第一行)。 這將從列表中刪除該節點。 此處的頭部保持不變,因為更改頭部將刪除應該刪除的節點之前的所有元素(如果已將其更改為已刪除的節點之后的節點)。
當應該刪除節點b
,所有節點a
要做的就是指向b
( c
)之后的節點。 列表如下所示:
... a -> b -> c -> ... // before deletion
... a -> c -> ... // after deletion, now a points to c
對於更好的可視化的解釋,您可以在這里查看 。 一般情況部分是描述第二種情況的地方。 移除操作在植入過程中並未明確進行,因為它是由垃圾收集器執行的。
LinkedLists
有幾種實現。 有些只保留pointer
列表head
的pointer
。 其他人跟蹤尾巴以完成O(1)
的尾巴附加
此實現不保留尾指針,因此您必須從頭開始遍歷列表
1 --> 2 --> null
^
head
因此, this
是列表的頭。 while循環在列表中移動,直到到達末尾為止(或直到n中的下一個節點指針等於null)為止。
在上面的示例中,循環將在此處終止
n n.next
2 null
然后,循環將退出並設置:
n.next = end
新列表如下所示:
1 --> 2 --> 3
^
head
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.