Разбор задачи: Разворот связного списка

Предложенный нами код решения:

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 = head
  • prev: используется для хранения ссылки на предыдущий узел. Изначально равен None, так как в развернутом списке первый элемент будет указывать на None.
  • current: инициализируется началом списка (head) и используется для итерации по узлам списка.

Основной цикл

while current:

Цикл выполняется до тех пор, пока есть текущий узел (current не равен None).

  1. Сохраняем ссылку на следующий узел:

    next_node = current.next

    next_node сохраняет ссылку на следующий узел, чтобы не потерять доступ к оставшейся части списка.

  2. Разворачиваем связь текущего узла:

    current.next = prev

    Перенаправляем ссылку current.next на предыдущий узел (prev).

  3. Обновляем prev и current для следующей итерации:

    prev = current
    current = next_node
    • prev становится текущим узлом.
    • current сдвигается на следующий узел (сохраняется в next_node).

Возврат новой головы

return prev

После выхода из цикла prev указывает на последний обработанный узел, который становится новой головой развернутого списка.


Пример работы алгоритма

Исходный список

head = 1 -> 2 -> 3 -> 4 -> 5 -> None
  1. Итерация 1:
    • current = 1, prev = None
    • Разворачиваем связь: 1 -> None
    • Обновляем указатели: prev = 1, current = 2
  2. Итерация 2:
    • current = 2, prev = 1
    • Разворачиваем связь: 2 -> 1 -> None
    • Обновляем указатели: prev = 2, current = 3
  3. Итерация 3:
    • current = 3, prev = 2
    • Разворачиваем связь: 3 -> 2 -> 1 -> None
    • Обновляем указатели: prev = 3, current = 4
  4. Итерация 4:
    • current = 4, prev = 3
    • Разворачиваем связь: 4 -> 3 -> 2 -> 1 -> None
    • Обновляем указатели: prev = 4, current = 5
  5. Итерация 5:
    • current = 5, prev = 4
    • Разворачиваем связь: 5 -> 4 -> 3 -> 2 -> 1 -> None
    • Обновляем указатели: prev = 5, current = None

Итоговый развернутый список

5 -> 4 -> 3 -> 2 -> 1 -> None

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии