Нашли ошибку?

Развернуть связанный список

СложнаяНайти ошибку2 ошибкиГлава 3

#рекурсивный случай#стек вызовов#связанные спискиid: ga-reverse-linked-list

Очередь печати хранится как односвязный список (глава 2): каждый узел знает только следующий. Функция reverse(head) должна рекурсивно развернуть список на месте и вернуть новую голову, не создавая новых узлов. В ней две ошибки — найдите и исправьте их.

Пример

head = Node(1, Node(2, Node(3)))
new_head = reverse(head)
# new_head: 3 → 2 → 1 → None

Идея алгоритма

Развернуть всё, кроме головы (рекурсивный случай). Затем прицепить голову в конец развёрнутой части. Новая голова — последний узел исходного списка.

Решение

class Node:
    """Узел односвязного списка."""

    def __init__(self, value: int, next: "Node | None" = None) -> None:
        self.value = value
        self.next = next


def reverse(head: Node | None) -> Node | None:
    """Разворачивает список на месте и возвращает новую голову."""
    if head is None or head.next is None:
        return head
    new_head = reverse(head.next)
    head.next.next = head
    return head

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 reverse_linked_list.py — тесты те же, результат покажет ✓ / ✗ и итог.