java链接列表,创建无名节点

时间:2018-06-11 18:53:01

标签: java nodes

我的问题可能过于简单:也许这就是我无法找到书面答案的原因。 我试图理解链接列表的构建方式,有一件事我无法理解: 通常,当我创建某种类的对象时,我需要给它一个名字,如:

 cat kitten =new cat();

在我这样做的同时,计算机给它一个地址,比如dfe @ fggv3444。 当我想在某种方法中使用创建的对象时,我通过我给它的名称来解决它:在我们的例子中:“cat”。 逻辑是,如果我用同名“cat”命名2个对象,计算机就不知道要访问哪个对象 - 或者两者都知道。 现在的问题是: 当我们使用链表时,使用的节点数在整个程序中会发生很大变化。那么节点类类型的这些对象如何得到它们的名字?显然他们必须有一个名字,但我不是在那里为每个节点命名......

它如何运作?!

提前谢谢。 我确信这个问题中的某些内容必须是愚蠢的,但无法弄清楚是什么。

5 个答案:

答案 0 :(得分:1)

每个cat名称基本上(如注释中指出的@Turing85)只是一个人类可读格式的cat实例的内存地址。

链接列表的核心是一组节点,每个节点都有一个valuenext节点(next是连接节点以形成列表的变量)。每只猫只被称为node.value,其中value是"名称"指向节点猫的地址。每个节点的next变量都指向下一个节点,该节点有自己的value

您不能在同一范围内将两个对象命名为同一个东西 - 您可以cat1cat2都为cat类型,并且每个对象都指向内存地址不同的cat。链接列表可以这样做的原因是因为每个节点都有自己的范围,没有其他节点可以看到。因此,所有节点都可以有nextvalue,称为node.nextnode.value

      node1        +--------> node2        +--------> node3
+--------------+   |    +--------------+   |    +--------------+
| value = cat1*|   |    | value = cat2 |   |    | value = cat3 |
| next = node2-|---+    | next = node3-|---+    | next = null  |
+--------------+        +--------------+        +--------------+

*---> cat1
+--------------+
| name = "tom" |
| col = "grey" |  ...and likewise for the other nodes
| ............ |

答案 1 :(得分:0)

Java有链接列表的内置类java.util.LinkedList当你实例化这个对象时,即。

LinkedList<Node> list = new LinkedList<Node>();

您正在创建引用,或者在您的情况下名称&#34; list&#34;到对象(你的链表)

整个列表都有一个名称&#34; list&#34;这可以作为你的遍历的起点。没有&#34;名称&#34;对于链表中的每个节点。在java中,您可以遍历列表,类似于数组的方式;通过索引。

list.get(someIndex)

此方法基本遍历列表直到someIndex,并返回该节点。您可以通过执行手动设置该节点的名称;

Node node = list.get(someIndex)

但总的来说,他们没有&#34;名称&#34;而是可以通过他们的索引或许多其他方法访问它们。

检查https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html以获取有关内置类

的更多详细信息

答案 2 :(得分:0)

在链表中,每个元素都由节点表示。这些节点通过其在内存中的地址保持其他元素。这可能是伪名称,但实际上它只是一种表示它在内存中的位置的方式。

让您感到困惑的是,您不会像在此代码中那样直接定义对象。

Animal cow = new Animal();

在这个例子中,我们在变量cow中分配了新对象数据的地址。这使我们可以轻松访问它。

与此相反,链表节点对象保存下一个节点的地址,但就像任何其他对象一样,它们只包含在该节点的属性中。

答案 3 :(得分:0)

在同一可见范围内,你不能给Java中的任何两个变量赋予相同的名称(虽然两个变量仍然存在,并且没有被Java垃圾收集器破坏。更多信息:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html),否则编译器不知道你指的是哪个值或对象。

要回答问题的第二部分,只要对象具有引用(访问对象的方式),就会存在该对象。您理解显然,必须访问添加到链表中的对象是正确的。假设第一个节点名为head,您必须在链表中找到对第三个节点的引用。 head.next.next将是对链接列表中第三个节点的引用,它不一定必须具有类似&#39; head&#39;的名称,但只要它具有引用就会存在。

希望这能回答你的问题!

答案 4 :(得分:0)

变量名仅用于提高可读性。 Java编译器将源代码转换为“机器可读”代码,该代码不包含变量名。值以特定地址存储在内存中,例如十六进制的0x00000000

每个节点都包含一个值和下一个节点的内存地址。当您致电cat.next();时,您的计算机将获取下一个节点的地址而不是变量名称,并且它知道该地址的位置。

注意:

  1. 值也可以存储在寄存器,缓存或磁盘中。它们还引用数据地址。
  2. Java LinkedList实际上是双向链接的,其中每个节点也包含其先前节点的地址。我们在这里使用单链表来简化。