关于单链表Node字段引用/值实现及C++无指针实现的技术问询
一、Node类内部的Node字段能否通过引用/值方式分别实现?
Java 场景
Java 中所有对象类型的变量本质都是引用,不存在直接存储对象本身的“值类型”对象字段。如果尝试在Node类中定义Node next(值方式),编译器会直接报错——因为实例化Node时需要先实例化它的next成员,而next又是一个Node,会陷入无限递归的对象构造,根本无法创建出合法的实例。所以Java里的链表节点,next字段只能是引用类型,也就是你代码里的写法。
Dart 场景
Dart 确实是“按值传递”,但这里的“值”对于对象来说是引用的副本。和Java一样,Dart也不允许类中直接包含自身的实例作为成员变量——同样会导致实例化时无限嵌套,内存无法分配。所以Dart里的链表节点next字段也只能是对象引用,你看到的类似代码能正常运行,本质还是用引用在串联节点。
简单说:在Java、Dart这类语言中,Node类的内部Node字段只能用引用方式实现,值方式根本无法完成对象的实例化,不存在可行性。
二、C++能否不用指针实现Node类?
你写的无指针版本代码:
class Node{ public: int data; Node next; };
这是完全不可行的。因为C++编译器需要确定类的内存大小,而Node中包含了另一个Node,会导致大小无限递归(Node的大小 = int的大小 + Node的大小),编译器无法计算出合法的内存布局,直接编译报错。
C里实现链表节点,必须用指针(Node* next)——指针的大小是固定的(比如32位系统4字节,64位8字节),这样Node的大小就能确定(int大小 + 指针大小)。如果想用引用(Node& next),但引用必须在初始化时绑定一个有效对象,不能为“空”,而链表的尾节点next需要指向空,所以引用并不适合做链表的next字段。因此C链表节点只能用指针实现next。
内容的提问来源于stack exchange,提问作者Skillkrio

