返回

算法扫盲:反转链表剖析与实践

前端

算法原理:拨开迷雾见本质

反转链表是一种经典的数据结构操作,它将链表中节点的顺序颠倒过来。理解其背后的原理至关重要,让我们从一个简单的例子入手。

假设我们有一个链表:[1, 2, 3, 4, 5]。

反转后,链表变为:[5, 4, 3, 2, 1]。

仔细观察,你会发现,反转后的链表中,每个节点的前驱节点变成了它的后继节点,反之亦然。

递归实现:简洁优雅的解法

掌握了算法原理,我们来看看如何使用递归实现反转链表。

思路:

  1. 递归到链表的最后一个节点,作为反转后的链表的表头。
  2. 依次递归到每个节点,将其指向它的前驱节点。
  3. 返回反转后的链表。

代码解析:

def reverse_list(head):
    """
    反转链表(递归实现)

    参数:
    head:链表的头节点

    返回:
    反转后的链表的头节点
    """

    # 递归终止条件:当链表为空或只有一个节点时,直接返回
    if not head or not head.next:
        return head

    # 递归到链表的最后一个节点
    new_head = reverse_list(head.next)

    # 将当前节点指向它的前驱节点
    head.next.next = head
    head.next = None

    # 返回反转后的链表的头节点
    return new_head

迭代实现:循环往复的魅力

除了递归,我们还可以使用迭代的方式来反转链表。

思路:

  1. 使用两个指针,一个指向当前节点,另一个指向它的前驱节点。
  2. 将当前节点指向它的前驱节点,然后将两个指针都向前移动一步。
  3. 重复步骤2,直到遍历完整个链表。

代码解析:

def reverse_list_iterative(head):
    """
    反转链表(迭代实现)

    参数:
    head:链表的头节点

    返回:
    反转后的链表的头节点
    """

    # 定义两个指针:current指向当前节点,prev指向它的前驱节点
    current = head
    prev = None

    # 遍历链表
    while current:
        # 将当前节点指向它的前驱节点
        next_node = current.next
        current.next = prev

        # 将两个指针都向前移动一步
        prev = current
        current = next_node

    # 返回反转后的链表的头节点
    return prev

LeetCode原题链接:

https://leetcode.com/problems/reverse-linked-list/

结语:登高望远,持续探索

反转链表是算法和数据结构领域的一个经典问题,掌握其解法不仅可以加深你对链表的理解,还能为你解决更复杂的算法问题奠定基础。希望通过本文的讲解,你已经对反转链表有了更深入的认识。在未来的学习中,不妨尝试更多不同的算法问题,不断挑战自我,提升自己的算法能力。