正确理解引用的含义
将某个变量赋值给引用,实际上就是将这个变量的地址赋值给引用,或者反过来说引用中存储了这个变量的内存地址,指向了这个变量,通过引用就能找到这个变量。
p.next=q
这行代码是说,p 结点中的 next 存储了 q 结点的内存地址
p->next=p->next->next
这行代码表示,p 结点的 next 指针存储了 p 结点的下下一个结点的内存地址
警惕引用丢失和内存泄漏
我们希望在结点 a 和相邻的结点 b 之间插入结点 x,假设当前引用 p 指向结点 a。
p.next = x; // 将p的next指向x结点;
x.next = p.next; // 将x的结点的next指向b结点;
p.next 在完成第一步操作之后,已经不再指向结点 b 了,而是指向结点 x。
第 2 行代码相当于将 x 赋值给 x.next,自己指向自己。
因此,整个链表也就断成了两半,从结点 b 往后的所有结点都无法访问到了。
对于有些语言来说,比如 C 语言,内存管理是由程序员负责的,如果没有手动释放结点对应的内存空间,就会产生内存泄露。
所以,我们插入结点时,一定要注意操作的顺序,同理,删除链表结点时,也一定要记得手动释放内存空间,否则,也会出现内
存泄漏的问题。
对于像 Java 这种虚拟机自动管理内存的编程语言来说,就不需要考虑这么多了。