【问题标题】:understanding linked lists理解链表
【发布时间】:2015-01-26 01:03:37
【问题描述】:

我无法理解课程中的链接列表。我似乎遇到的最大问题是数据的存储方式。我看代码主要是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 上从一本更详细的教科书Source 中找到了这段代码。粘贴代码太长了。

所以总的来说,我看到名为“Head”、“Tail”和“u”的类存储像[Head]->[u]->[Tail] 这样的信息。此外,当我阅读 add 方法时,我将存储的信息可视化为 [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]

【问题讨论】:

  • 比起理解链表,您似乎需要花一些时间来更好地理解 Java 中对象实例化和范围的概念。但是,要回答您的最后一个问题:不,代码不应该是您提出的。
  • uadd 方法中是已知的。这是您在方法中为新创建的节点指定的名称,仅此而已。

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


【解决方案1】:

变量名本身并不像你认为的那样重要。 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 的节点。因此,我们只需更新该节点的 next 以指向 u 指向的同一节点(因为这是我们新创建的节点想要添加到列表的末尾)。

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

【讨论】:

  • 好的,所以 Node 不像其他类,每个类都需要一个唯一的标签。 u 只是对节点的引用,节点本身是通过 java 管理的。如此有效,它看起来像 [Node 0 (head)]->[Node 1 (u)]->[Node 2 (tail)]。这是有道理的。
  • @DrewS 我猜你还是很困惑。 u 只是您在 add 方法中为新节点指定的名称。在它之外,它只是一个节点,没有标签。在链表中你知道headtail,你可以通过它们的链接到达其他Node
【解决方案2】:

所以,你想在你的链表中添加一个节点。

这将创建节点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将同时是headtail)。您还需要增加节点n 的计数器。

tail = u;
n++;

【讨论】:

    【解决方案3】:

    从 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 包含下一个和上一个节点,因此每个节点都知道它的上一个和下一个节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      相关资源
      最近更新 更多