Программа курса:
Разбор задачи: Разворот связного списка
Предложенный нами код решения:
def reverse_list(head):
"""
Разворачивает односвязный список.
:param head: ListNode, голова односвязного списка
:return: ListNode, голова развернутого списка
"""
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prevЗаголовок функции
def reverse_list(head):Функция reverse_list принимает в качестве параметра head, который представляет собой объект класса ListNode, являющийся головой односвязного списка.
Докстрока
"""
Разворачивает односвязный список.
:param head: ListNode, голова односвязного списка
:return: ListNode, голова развернутого списка
"""Докстрока описывает назначение функции: она разворачивает односвязный список, возвращая его новую голову.
Локальные переменные
prev = None
current = headprev: используется для хранения ссылки на предыдущий узел. Изначально равенNone, так как в развернутом списке первый элемент будет указывать наNone.current: инициализируется началом списка (head) и используется для итерации по узлам списка.
Основной цикл
while current:Цикл выполняется до тех пор, пока есть текущий узел (current не равен None).
Сохраняем ссылку на следующий узел:
next_node = current.nextnext_nodeсохраняет ссылку на следующий узел, чтобы не потерять доступ к оставшейся части списка.Разворачиваем связь текущего узла:
current.next = prevПеренаправляем ссылку
current.nextна предыдущий узел (prev).Обновляем
prevиcurrentдля следующей итерации:prev = current current = next_nodeprevстановится текущим узлом.currentсдвигается на следующий узел (сохраняется вnext_node).
Возврат новой головы
return prevПосле выхода из цикла prev указывает на последний обработанный узел, который становится новой головой развернутого списка.
Пример работы алгоритма
Исходный список
head = 1 -> 2 -> 3 -> 4 -> 5 -> None- Итерация 1:
current = 1,prev = None- Разворачиваем связь:
1 -> None - Обновляем указатели:
prev = 1,current = 2
- Итерация 2:
current = 2,prev = 1- Разворачиваем связь:
2 -> 1 -> None - Обновляем указатели:
prev = 2,current = 3
- Итерация 3:
current = 3,prev = 2- Разворачиваем связь:
3 -> 2 -> 1 -> None - Обновляем указатели:
prev = 3,current = 4
- Итерация 4:
current = 4,prev = 3- Разворачиваем связь:
4 -> 3 -> 2 -> 1 -> None - Обновляем указатели:
prev = 4,current = 5
- Итерация 5:
current = 5,prev = 4- Разворачиваем связь:
5 -> 4 -> 3 -> 2 -> 1 -> None - Обновляем указатели:
prev = 5,current = None
Итоговый развернутый список
5 -> 4 -> 3 -> 2 -> 1 -> None