簡體   English   中英

LinkedList-試圖了解實現

[英]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要做的就是指向bc )之后的節點。 列表如下所示:

... a -> b -> c -> ...  // before deletion
... a -> c -> ...       // after deletion, now a points to c

對於更好的可視化的解釋,您可以在這里查看 一般情況部分是描述第二種情況的地方。 移除操作在植入過程中並未明確進行,因為它是由垃圾收集器執行的。

LinkedLists有幾種實現。 有些只保留pointer列表headpointer 其他人跟蹤尾巴以完成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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM