Reverse Linked List
Дан головной узел head односвязного списка. Разверните список и верните новый
головной узел.
1 → 2 → 3 → 4 → 5 output: 5 → 4 → 3 → 2 → 1
head = null output = null
Подсказка
Держите три указателя: prev, curr и nxt. Сначала
сохраните curr.next, только потом разверните связь.
Решение
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def reverse_list(head): # итеративно
prev, curr = None, head
while curr:
nxt = curr.next # сохранить, пока не потеряли
curr.next = prev # развернуть связь
prev, curr = curr, nxt # шаг вперёд
return prev
def reverse_list_rec(head): # рекурсивно
if not head or not head.next:
return head
new_head = reverse_list_rec(head.next)
head.next.next = head # разворот связи «назад по ходу»
head.next = None
return new_head
Сложность: время O(n), память O(1) в итеративной
версии и O(n) в рекурсивной (стек вызовов).