LinkedList - 试图理解实现

时间:2016-06-16 18:21:08

标签: java algorithm data-structures linked-list

我正在学习解决复杂的算法。为此,我遇到了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;
        }
   }
}

2 个答案:

答案 0 :(得分:3)

这里有两种情况需要考虑:首先,当节点是列表中的第一个时。然后头部移动到下一个节点,第一个节点不再是列表的一部分。

在第二种情况下,我们只是按节点迭代整个列表。如果我们到达其下一个节点需要删除的节点(由if语句检查),则将其更改为在删除的节点之后保存节点作为下一个节点(if语句中的第一行)。这将从列表中删除该节点。这里的头部保持不变,因为更改它会删除应该删除的节点之前的所有元素(如果它被删除后更改为节点)。

当应该删除节点b时,所有节点a必须指向bc)之后的节点。列表的外观如下:

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

有关更好的可视化的解释,您可以查看here。一般情况部分是描述第二种情况的地方。在移植过程中明确进行移除的处理,因为它是由垃圾收集器完成的。

答案 1 :(得分:1)

LinkedLists有几个实现。有些只保留pointer到列表的head。其他人跟踪尾部以完成追尾O(1)

此实现不维护尾部指针,因此您必须从头部

开始遍历列表
1 --> 2 --> null
^
head

所以this指的是列表的头部。 while循环遍历列表直到它到达结尾或(直到n中的下一个节点指针等于null)

在上面的示例中,循环将在此处终止

n  n.next
2   null

然后循环退出并设置:

n.next = end

新列表如下所示:

1 --> 2 --> 3
^
head