繁体   English   中英

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

[英]java- linked lists, creating nameless nodes

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

 cat kitten =new cat();

在执行此操作的同时,计算机会为其提供一个地址,例如dfe @ fggv3444。 当我想以某种方法使用创建的对象时,我用我给它的名称来解决它:在我们的例子中是“ cat”。 逻辑是,如果我用相同的名称“ cat”命名2个对象,则计算机将不知道要访问哪个对象,或者可能都不知道。 现在的问题是:当我们使用链表时,整个程序中使用的节点数变化很大。 那么节点类类型的对象如何获得其名称? 显然他们必须有一个名字,但是我不在那里给每个节点起名字...

这个怎么运作?!

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

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

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

您不能在同一范围内为相同的对象命名-您可以使cat1cat2都属于cat类型,并且每个都指向不同cat的内存地址。 链表之所以能够做到这一点,是因为每个节点都有自己的作用域,而其他节点看不到。 因此,所有节点都可以有一个next和一个value ,称为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
| ............ |

Java实例化此对象时,Java有一个用于链接列表的内置类java.util.LinkedList

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

您正在创建引用 ,或者在您的情况下, 名称为对象(您的链接列表)的“列表”

整个列表都有一个名称“列表”,可以作为遍历的起点。 链表中的每个节点都没有“名称”。 在Java中,您可以遍历列表,有点类似于数组。 通过索引。

list.get(someIndex)

此方法基本上遍历列表,直到someIndex,然后返回那里的节点。 您可以通过手动为该节点设置名称。

Node node = list.get(someIndex)

但是通常,它们没有“名称”,而是可以通过它们的索引或许多其他方法来访问它们。

检查https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html,以获取有关内置类的更多详细信息

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

可能使您感到困惑的是,您没有像在此代码中那样直接定义对象。

Animal cow = new Animal();

在这种情况下,我们在变量cow分配了新对象数据的地址。 这使我们可以轻松访问它。

与此相反,链表节点对象保留下一个节点的地址,但与其他任何对象一样,它们只是该节点的属性而被包含。

您不能在相同的可见性范围内为Java中的任何两个变量赋予相同的名称(而这两个变量仍然存在,并且不会被Java垃圾收集器丢弃。)更多信息: http : //www.oracle.com/webfolder/ technetwork / tutorials / obe / java / gc0​​1 / index.html ),否则编译器将不知道您所指的是哪个值或对象。

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

希望这能回答您的问题!

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

每个节点包含一个值和下一个节点的内存地址。 调用cat.next(); ,您的计算机将获取下一个节点的地址而不是变量名,并且它知道该地址在哪里。

注意:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM