Основы связанного списка

Я пытаюсь понять основы Linked List. Определение моего класса LinkedList выглядит следующим образом:

 public class ListNode {
 int val;
 ListNode next;
 ListNode(int x) { val = x; }

Теперь я столкнулся с проблемой. Мой код выглядит следующим образом:

ListNode dummy = new ListNode(0);
dummy.next =  head;
ListNode prev = dummy;
ListNode slow = head;
head.next = null;
prev.next = slow;

ListNode temp = slow.next;
prev.next = temp;

System.out.println(dummy.next); //comes out null

Почему это значение равно нулю? dummy.next указывал на голову, а я заменил только slow и prev?

Обновлено:

Можем ли мы использовать slow и head как взаимозаменяемые? Если да, то почему это происходит?

// head points to a Linked list starting from 1 in 1 -> 2 -> 3
ListNode curr = head;

while(curr.next!= null){
    curr= curr.next;
}

System.out.println(curr);
System.out.println(head); //these are different and head does not change

Почему бы не попробовать и не посмотреть, что произойдет?

Turing85 30.06.2018 01:08

Перекрестные публикации: stackoverflow.com/q/51110381/781723, cs.stackexchange.com/q/93668/755. Пожалуйста не размещайте один и тот же вопрос на нескольких сайтах. У каждого сообщества должен быть честный шанс ответить, не тратя время зря.

D.W. 30.06.2018 07:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы объявляете, что dummy указывает на тот же объект, что и head. Затем вы делаете head.next = null;. Поскольку dummy и head ссылаются на один и тот же объект, dummy.next также имеет значение null.

Обновлено:

Посмотрев дальше на ваш код, я обнаружил проблему.

Я вставлю ваш код с номерами строк для удобства.

ListNode dummy = new ListNode(0); // Line 1
dummy.next =  head; // Line 2
ListNode prev = dummy; // Line 3
ListNode slow = head; // Line 4
head.next = null; // Line 5
prev.next = slow; // Line 6

ListNode temp = slow.next; // Line 7
prev.next = temp; // Line 8

System.out.println(dummy.next); // Line 9

Строки 3-4: Теперь prev указывает на тот же объект, что и dummy, и то же самое для slow и head. По сути, мы можем использовать эти «имена» как синонимы.

Строка 5: установка head рядом с нулевым значением

Строка 6: То же, что и при запуске: dummy.next = head

Строка 7: temp теперь указывает на следующий head (поскольку slow и head одинаковы). Помните, что следующее значение head равно нулю (строка 5). По сути, это означает, что temp равен нулю.

Строка 8: То же, что и dummy.next = temp. Поскольку значение temp равно нулю, здесь вы устанавливаете dummy рядом с нулем

Привет! Спасибо за ответы. На самом деле у меня был dummy.next = head, а не dummy = head.

crazyy_photonn 30.06.2018 02:11

Где вы сначала инициализируете переменную dummy?

Beöbe 30.06.2018 02:19

Привет, Боби! Я отредактировал вопрос, чтобы ответить на вашу озабоченность. Спасибо за ответ!

crazyy_photonn 30.06.2018 02:22

Без проблем! Спасибо за разъяснение вопроса.

Beöbe 30.06.2018 02:26

Меня все это очень смущает.

crazyy_photonn 30.06.2018 02:33

@crazyy_photonn Я нашел проблему. Я обновил ответ.

Beöbe 30.06.2018 02:51

Привет! Спасибо за предельно подробное объяснение. Что касается объяснения, которое вы даете, у меня есть сомнения. Код выглядит следующим образом: Предположим, что заголовок указывает на связанный список 1 -> 2 -> 3. Голова - это узел со значением 1. Теперь ListNode curr = head ; в то время как (curr.next! = null) {curr = curr.next; } System.out.println (curr); System.out.println (голова); Эти двое разные. Если мы можем использовать curr и head как взаимозаменяемые, почему это показывает разные результаты?

crazyy_photonn 30.06.2018 03:55

Я отредактировал вопрос, чтобы отразить мои затруднения? Надеюсь, мне понятнее то, о чем я прошу. Не стесняйтесь спрашивать, если что-то не имеет смысла. Спасибо!

crazyy_photonn 30.06.2018 04:10

Я только сказал, что мы можем использовать curr и head как взаимозаменяемые, потому что вы изначально определяете переменную curr в указать на - тот же объект, на который указывает head. Если вы сделали curr.val = 5;, то вы увидите, что head.val также был изменен на 5. head и curr - это два способа ссылки на один и тот же базовый объект. Но, в вашем цикле while вы переназначаете curr. Это означает, что он больше не будет указывать на тот же объект, на который указывает head.

Beöbe 30.06.2018 04:15

Ох!! Это действительно имеет смысл. Большое спасибо за то, что прояснили это для меня! Я приму твой ответ. Еще раз спасибо!

crazyy_photonn 30.06.2018 04:19

Другие вопросы по теме