假设我们有一个链表 1->2->3->4->5
和1
是head
ListNode newHead = new ListNode(0);
ListNode p = newHead;
ListNode runner = newHead;
newHead.next = head; // Line 1 p and runner next is also head
while(n>0){
runner = runner.next; // Line 2 why newHead and p does not move along with runner just as above because they are equal object (I assume)
n--;
}
为什么不p
, newHead
和runner
全部同时改变?在 Line 1
他们确实这样做,但在 Line 2
他们不这样做,为什么?
最佳答案
假设newHead
位于内存位置A
。
由于您将 newHead
分配给 p
,p
现在也指向内存位置 A
。
runner
的逻辑相同,指向 A
。
现在您设置了 newHead
的一些属性,这会“更改”所有三个 newHead
、p
和 runner 上的属性
因为它们都指向同一内存位置 A
中的同一对象。
如果您现在编写 runner = runner.next
,则可以为 runner
分配一个新值。
现在,runner
指向内存位置B
。
但这对于 p
和 newHead
来说根本不重要,因为它们只指向与 runner
相同的位置,但没有其他关系那。他们只指向相同的位置/相同的对象。如果您更改了对象,那么三个人都会知道该更改。但是,如果您更改三个指向之一的位置,则其他两个指向的位置并不重要。
Java 非原始变量只是指向实际对象所在内存地址的指针/引用。作为开发人员,您不必处理指针可能引起的问题(或访问它们提供的功能)。
关于java - 单链表复制困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34473156/