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 = 1int 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