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

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

Метод 1: итеративный подход
Один из способов инвертировать связанный список в парах — использовать итеративный подход. Идея состоит в том, чтобы пройти по связанному списку парами и поменять местами элементы внутри каждой пары. Вот реализация на Python:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
def reverse_linked_list_in_pairs(head):
    dummy = ListNode(0)
    dummy.next = head
    prev = dummy
    while prev.next and prev.next.next:
        first = prev.next
        second = prev.next.next
        first.next = second.next
        second.next = first
        prev.next = second
        prev = prev.next.next
    return dummy.next

Метод 2: рекурсивный подход
Другой подход к обращению связанного списка в парах — использование рекурсивного метода. Этот подход предполагает рекурсивную замену элементов попарно. Вот реализация на Python:

def reverse_linked_list_in_pairs(head):
    if not head or not head.next:
        return head
    first = head
    second = head.next
    first.next = reverse_linked_list_in_pairs(second.next)
    second.next = first
    return second

Метод 3: стековой подход
Стековой подход также можно использовать для реверсирования связанного списка в парах. Этот метод предполагает использование стека для перестановки элементов попарно. Вот реализация на Python:

def reverse_linked_list_in_pairs(head):
    stack = []
    dummy = ListNode(0)
    dummy.next = head
    current = dummy
    while current.next and current.next.next:
        first = current.next
        second = current.next.next
        current.next = second
        first.next = second.next
        second.next = first
        stack.append(first)
        stack.append(second)
        current = current.next.next
    while stack:
        current.next = stack.pop()
        current = current.next
    current.next = None
    return dummy.next

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