2015-12-26 1 views
0

Предположим, что мы имеем один список 1->2->3->4->5 и 1 является headSinglely LinkedList копия confusioin

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 они этого не делают, почему?

+0

Где вы определяете 'head'? Строка 1, по-видимому, используется, чтобы заставить цикл цикла работать и для главы списка. Не могли бы вы также объяснить ожидаемое поведение кода? –

ответ

1

Предполагается, что newHead находится в памяти A.
Поскольку вы назначаете newHead в p, p теперь указывает на ячейку памяти A.
Такая же логика для runner, указывая на A.

Теперь необходимо установить некоторое свойство newHead, который «изменяет» собственность на все три newHead, p и runner, так как все точки на тот же объект в том же месте памяти A.

Если вы сейчас пишете runner = runner.next, вы назначаете новое значение runner.
Теперь runner указывает на расположение памяти B.

Но это просто не имеет значения для p и newHead, поскольку они указывают только на то же место, что и runner, но не имели никакого отношения. Они указали только на одно и то же место/тот же объект. Если вы измените объект, все трое знают об этом изменении. Но если вы перейдете к одному из трех пунктов, это не имеет значения для двух других.

Java-непримитивные переменные - это просто указатели/ссылки на адреса памяти, где находится фактический объект. Без вас, поскольку разработчик должен иметь дело с проблемами, которые могут возникнуть у указателей (или иметь доступ к предоставляемым им функциям).