class LinkedlistNode {
int data;
LinkedlistNode next=null ;
}`
从我接触链表概念的第一天起,我就一直不相信我们如何在节点内定义节点。当我们已经定义了某个东西时,我们如何才能定义它?
我试图询问聊天gpt,他告诉我编译器早些时候知道有一个名为node的类,但它的定义尚未完成,所以它会等到类被JVM加载,但我不相信。然后在Quora上我看到一个答案说指针或引用已经有固定的大小了。
编译器可以以不同的方式做事(比如一次或多遍),但我们可以想象这个过程:
当编译器解析代码时,它会构建一个符号(名称)表,该表一开始是空的。例如,我们可以想象该表是这样的:
名字 | 类型 | 价值 |
---|---|---|
... | .... | ... |
解析
class LinkedlistNode
时,符号 LinkedlistNode
会添加到该表中:
名字 | 类型 | 价值 |
---|---|---|
链表节点 | 班级 | (空) |
然后处理
int data
:类获取其第一个具有已知(原始)类型的成员:
名字 | 类型 | 价值 |
---|---|---|
链表节点 | 班级 | { 整数数据 } |
当遇到
LinkedlistNode next
时,名称 LinkedListNode
就会被识别,因此这并不神秘:该类获得了第二个成员:
名字 | 类型 | 价值 |
---|---|---|
链表节点 | 班级 | { int data, LinkedListNode next } |
我们刚刚引入了一个反向引用,如果你愿意的话,也可以是一个循环。 LinkedListNode
的
value部分尚未最终确定并不是问题。这里唯一重要的是
LinkedListNode
是我们再次遇到它时符号表中的一个条目——这里就是这种情况。