Перевернутый связанный список: Почему имеет значение положение head = head.next?

#python #linked-list

Вопрос:

Может ли кто-нибудь объяснить, почему позиция этой линии head=head.next должна быть сразу после curr=head , а не дальше вниз? Изначально я вставлял head=head.next последнюю строку цикла while, но получал только последний узел. Напр.. Если бы ввод был [1,2,3] , я бы [1] использовал второй блок кода и [3,2,1] с первым.

Правильный:

 def reverseListIterative(head: ListNode):  prev = None  while head:  curr = head  head = head.next  curr.next = prev  prev = curr  return prev  

Неправильный:

 def reverseListIterative(head: ListNode):  prev = None  while head:  curr = head  curr.next = prev  prev = curr  head = head.next  return prev  

Комментарии:

1.На момент назначения head curr и head являются одним и тем же. Таким образом, назначение curr.next = prev изменяет оригинал head.next , то есть тот, который использовался в задании head = head.next . Поэтому очевидно, что выполнение этого задания до выполнения задания head изменило бы его.

2. Обратите внимание, что curr is head в этот момент. Так что любая мутация curr (например curr.next = prev ) тоже повлияла head бы , если бы вы сначала не переназначили ее.

3. С помощью чего-то подобного это помогает нарисовать диаграмму, показывающую, на что указывают вещи. Это вообще не языковая проблема, а на самом деле просто упражнение в рассуждении чего-то путем тщательного анализа.

4. @TomKarzes и пользователь 2390182 Спасибо! Поймите, что произошло сейчас

Ответ №1:

Вы могли бы выяснить это, отслеживая содержимое каждой переменной в потоке кода (вам даже не нужно ее запускать).:

Допустим, мы начнем со списка 1 -gt; 2 -gt;gt; 3

 prev curr head head.next curr.next  ---- ---- ---- --------- ---------  prev = None None - 1 2 - while head:  curr = head None 1 1 2 2   curr.next = prev None 1 1 None None ***   prev = curr 1 1 1 None None   head = head.next 1 1 None - None  return prev  

Когда вы назначаете prev (Нет) для curr.next, вы теряете соединение с head.next, потому что head также указывает на узел № 1.