就是区分什么时候是实际修改了链表,什么时候只是链表的引用 我经常写代码写着写着就忘记了,一旦忘记了这个事情,代码就会写乱
- 首先,链表是引用类型
- 函数传递链表,传递是值类型(也就是指向链表的内存地址副本),也叫什么“引用的副本”
- 对引用类型本身的修改,会影响原链表(也就是修改了链表)
- 什么是本身的修改?链表本身有2个属性,一个是val值,一个是next指针
- 修改了这两个属性,就是修改了链表
- 否则,你只是在移动链表指针(就是移动指向链表的内存地址副本的地址位置),对原链表没有影响
看一个实际的代码例子:

Preview
这2个函数传入的链表一样,返回的链表也是一样的,下面的函数是利用栈模拟递归,两个函数的功能一样。但是,对传入的链表的操作是不一样的。
在递归中,可以明显看到
java
head.next = removeNodes1(head.next);
这个是修改了链表的next指针,所以传入的链表作为引用类型,实际被修改了
而在循环中 没有.next =
类似的代码,所以传入的原始链表是没有被修改的 为什么没有被修改会返回一个新的链表呢? 函数内部的压栈操作,操作head指针的地址移动到了null,之后重新连接节点 相当于返回了一个新的链表