单链表副本confusioin

时间:2015-12-26 16:31:20

标签: java linked-list nodes

假设我们有一个链接列表1->2->3->4->51head

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--;
}

为什么不pnewHeadrunner同时发生变化?他们在Line 1做了,但在Line 2他们不知道为什么?

1 个答案:

答案 0 :(得分:1)

假设newHead位于记忆位置A 由于您将newHead分配给pp现在也指向内存位置A
runner的逻辑相同,指向A

现在你设置newHead的一些属性,其中"更改"所有三个newHeadprunner上的属性,因为它们都指向同一内存位置A中的同一个对象。

如果您现在写runner = runner.next,则为runner分配一个新值 现在runner指向内存位置B

但这对pnewHead无关紧要,因为它们只指向与runner相同的位置,但没有其他关系。它们只指向相同的位置/相同的对象。如果您更改了对象,则所有三个都知道该更改。但是如果你改变其中三个点之一,那对其他两个点无关紧要。

Java非原始变量只是指向实际对象所在的内存地址的指针/引用。没有你作为开发人员必须处理指针可能引起的问题(或访问他们提供的功能)。