Связанные списки — это фундаментальные структуры данных, используемые в информатике для хранения коллекций данных и управления ими. Реверсирование связанного списка предполагает изменение направления указателей для создания нового порядка. В этой статье мы рассмотрим различные методы инвертирования связанного списка с помощью трех указателей. Для лучшего понимания каждый метод будет сопровождаться примерами кода.
Метод 1: итеративный подход
Итеративный подход предполагает обход связанного списка с одновременным обращением указателей. Вот пример кода:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverse_linked_list(head):
prev = None
current = head
while current:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
Метод 2: рекурсивный подход
Рекурсивный подход использует рекурсивную функцию для обращения связанного списка. Вот пример кода:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverse_linked_list(head):
if not head or not head.next:
return head
reversed_list = reverse_linked_list(head.next)
head.next.next = head
head.next = None
return reversed_list
Метод 3: подход стека
В этом подходе мы используем структуру данных стека для реверсирования связанного списка. Вот пример кода:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def reverse_linked_list(head):
stack = []
current = head
while current:
stack.append(current)
current = current.next
head = stack.pop()
current = head
while stack:
current.next = stack.pop()
current = current.next
current.next = None
return head
Реверсирование связанного списка с использованием трех указателей может быть достигнуто с помощью различных методов, таких как итеративный, рекурсивный и стековой подходы. Каждый метод имеет свои преимущества и может оказаться более подходящим в зависимости от конкретных требований вашей программы. Понимая эти методы и примеры их кода, вы сможете уверенно реверсировать связанные списки и эффективно манипулировать данными в своих проектах.
При выборе между этими методами не забывайте учитывать такие факторы, как временная и пространственная сложность. Поэкспериментируйте с разными подходами, чтобы найти лучшее решение для вашего случая использования.