Реверс связанного списка: изучение нескольких методов с примерами кода

Связанные списки — это фундаментальные структуры данных, используемые в информатике для хранения коллекций данных и управления ими. Реверсирование связанного списка предполагает изменение направления указателей для создания нового порядка. В этой статье мы рассмотрим различные методы инвертирования связанного списка с помощью трех указателей. Для лучшего понимания каждый метод будет сопровождаться примерами кода.

Метод 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

Реверсирование связанного списка с использованием трех указателей может быть достигнуто с помощью различных методов, таких как итеративный, рекурсивный и стековой подходы. Каждый метод имеет свои преимущества и может оказаться более подходящим в зависимости от конкретных требований вашей программы. Понимая эти методы и примеры их кода, вы сможете уверенно реверсировать связанные списки и эффективно манипулировать данными в своих проектах.

При выборе между этими методами не забывайте учитывать такие факторы, как временная и пространственная сложность. Поэкспериментируйте с разными подходами, чтобы найти лучшее решение для вашего случая использования.