Java 中 linked list是怎么修改next节点和自身的?

写了如下的一段代码,调试时发现,当代码走到slow.next = head;时,start、slow、fast以及他们的next节点指向的都是同一个对象就是start和start.next。
但是当走到fast = fast.next; 时,这时只会改变fast指向的对象而不再会改变其他的对象。
这个是因为什么呢?Java 对象本身不是一个引用类型,但存在ListNode中的属性next是引用类型导致的?

ListNode start = new ListNode(0);

ListNode slow = start;

ListNode fast = start;

slow.next = head;

fast = fast.next;


回答:

不用想太复杂,java里基本类型和引用类型的赋值传递逻辑是一样的

int a = 0;

int b = a;

int c = a;

a = 2;

只要没有 b = 2 的调用,b 就始终是 0


回答:

fast 被重新赋值了,而不是给fast指向的引用重新赋值

原因很简单,首先需要区别赋值和定义,然后区分引用和值对象

ListNode start = new ListNode(0);

ListNode slow = start;

ListNode fast = start;

这三句定义了了三个变量并赋予了相同的值(引用的copy)

slow.next = head;

fast = fast.next;

这两行是单纯的赋值。

前三行的作用是给 同一实例 new ListNode(0) 起了三个名称 a b c
第四行是给 同一实例的next字段赋予了head所引用的实例的地址(引用)
第五行是给c 重新赋值(c对应的引用变了,但不影响a b 为什么不影响后面会讲到) 赋予的值是是上一步head引用的实例的地址(引用)

为什么给c 直接赋值没有影响a b 呢?

我们举两个例子

int a = 1

int b = a

int c = a

int a = 2

问最后 b c是几?
在来一个例子

int a = new Node(1)

int b = a

int c = a

int a.value = 2

问最后b.value c.value 是几?

为什么会出现这种情况呢?
还是回到开头第一个例子前三行(定义和赋值)是对值类型的copy(不是引用,是三个1)
第二个例子前三行(定义和赋值)是对引用类型的copy((同一实例的三个引用)指向同一个实例,该实例存储了一个1)

第四行都是赋值,区别是给变量重新赋值 还是 给引用指向的变量重新赋值

回到问题第五行代码

fast = fast.next;

fast 被重新赋值了,而不是给fast指向的引用重新赋值,也不是给fast指向的引用的变量重新赋值

以上是 Java 中 linked list是怎么修改next节点和自身的? 的全部内容, 来源链接: utcz.com/p/944664.html

回到顶部