理解链表

时间:2015-01-26 01:03:37

标签: java linked-list singly-linked-list doubly-linked-list

我无法理解课程中的链接列表。我似乎遇到的最大问题是如何存储数据。我看到代码主要是add(x)在列表中添加一个新节点,但似乎没有意义。

添加代码。

boolean add(T x) {
  Node u = new Node();
  u.x = x;
  if (n == 0) {
    head = u;
  } else {
    tail.next = u;
  }
  tail = u;
  n++;
  return true;
}

这直接来自我所学课程的教科书。我上网查找了更多资源,我从更详细的教科书Source中找到了GITHUB上的代码。只需粘贴代码即可。

所以我看到所有名为' Head' '尾部'并且' u'存储[Head]->[u]->[Tail]等信息。在我阅读add方法时,我将存储的信息可视化为[Head]->[u]->[u]->[u]->[Tail]

每个节点如何知道哪个' u'要看的节点。每个都引用u节点。每次u都被覆盖,或者u信息会返回u的所有值node.nextu如何区分每个add(x) { Node u = new Node(); u.x = x; } 节点?不应该是代码而不是:

add(x,y) {
  Node y = new Node();
  u.x = x;
}

更像是:

[Head]->[a]->[b]->[c]->[Tail]

因此,每个节点都有一个不同的名称可链接到{{1}}

3 个答案:

答案 0 :(得分:2)

变量名称本身在你认为它们的意义上并不重要。 u只是指向Node的一个实例。

假设您要创建一个整数链接列表:

你做add(1)。此时,n=0。 在add方法中,初始化了一个新节点。我们只是将其称为u。现在,我们将值设置为1。到目前为止,我们已创建Node,其值等于1

由于n=0,我们的head现在也会引用此节点。我们递增n++以跟踪列表的当前长度。我们还让tail引用新添加的节点,因为我们总是添加到列表的 end

现在,你做add(2)。此时,n=0。在add方法中,初始化了一个新节点。我们只是将其称为u。现在,我们将值设置为1。我们不需要更新头部,因为1是列表的第一个节点。

但是,我们需要将2添加到列表的末尾。这意味着tail必须引用创建的节点,其值为2.那么,我们该怎么做?那么,tail截至目前已经指的是其值为1的节点。因此,我们只是更新该节点的下一个指向u所指向的同一节点(因为这是新的创建我们想要添加到列表末尾的节点。)

要完成此操作,我们会增加n并将tail设置为指向我们刚刚添加的节点。

答案 1 :(得分:0)

因此,您希望将节点添加到链接列表中。

这将创建节点u,其中包含相应的信息x

Node u = new Node();
u.x = x;

现在,有两个选项:

A - 这是您要添加到链接列表的第一个节点

B - 列表中已有节点,而您正在添加另一个节点。

这是if进入的地方。

if (n == 0) {
  head = u;
} else {
  tail.next = u;
}

A - 如果n(列表中的节点计数器)等于0,则它为空。因此,节点u是它的头。

B - 否则,您在实际tail之后添加新节点,因此您添加对实际tail的引用,表示此节点将成为下一个节点。


最后,你必须说你要添加的节点是链接列表的新tail(如果它是空的,那么u将是head和{{ 1}}同时)。您还需要递增节点tail的计数器。

n

答案 2 :(得分:0)

从java.util.LinkedList开始,Node类描述如下:

private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;
    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

Node保存next节点和prev节点,因此每个节点都知道它的上一个节点和下一个节点。