#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.