了解链表



我在理解课程中的链表时遇到问题。我似乎遇到的最大问题是数据的存储方式。我看到代码主要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;
}

这直接来自我正在学习的课程的教科书。我上网寻找更多资源,我在GITHUB上从更详细的教科书来源中找到了这段代码。代码很长,只是粘贴。

所以总的来说,我看到名为"头"尾巴"和"u"的类存储像[Head]->[u]->[Tail]这样的信息。此外,当我阅读添加方法时,我可视化存储的信息看起来像[Head]->[u]->[u]->[u]->[Tail]

每个节点如何知道要查看哪个"u"节点。每个都引用u节点。要么每次u都被覆盖,要么获取u信息将返回所有u的值。node.next如何区分每个u节点?不应该是代码而不是:

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

更像:

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

因此,每个节点都有不同的名称来链接到[Head]->[a]->[b]->[c]->[Tail]

变量名称本身并不重要,就像你认为它们一样重要。 u只是指向 Node 的一个实例。

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

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

因为,n=0,我们的head现在也将引用这个节点。我们递增,n++,以跟踪列表的当前长度。我们还使我们的tail引用新添加的节点,因为我们总是添加到列表的末尾

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

但是,我们需要将2添加到列表的末尾。这意味着tail必须引用为 2 的新创建的节点。那么,我们如何做到这一点呢?好吧,到目前为止,tail一直指的是值为 1 的节点。因此,我们只需更新该节点的旁边,以指向u指向的同一节点(因为这是我们要添加到列表末尾的新创建的节点)。

最后,我们将递增n并将tail设置为指向我们刚刚添加的节点。

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

这将创建节点u,并x相应的信息。

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

现在,有 2 个选项:

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

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

这是 if 进入的地方。

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

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

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


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

tail = u;
n++;

来自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;
    }
}
节点同时包含下一个节点和上一个节点

,因此每个节点都知道其上一个和下一个节点。

相关内容

  • 没有找到相关文章

最新更新