返回

算法实战:图解 LeetCode 24. 两两交换链表中的节点

后端

前言

链表是一种重要的数据结构,广泛应用于各种编程场景。LeetCode 24 题考察了链表操作的进阶技巧——两两交换链表中的节点。本篇文章将深入剖析此算法的原理和实现,辅以清晰的图示和示例,带你领略算法之美。

算法原理

两两交换链表节点的算法核心思想是:逐对交换相邻节点的指向,从而实现节点的交换。具体步骤如下:

  1. 初始化: 设置两个指针 prevcurr 分别指向链表的头节点和第一个要交换的节点。
  2. 两两交换:
    • 交换 currcurr.nextnext 指向。
    • 更新 prevnext 指向为 curr.next
    • 更新 currcurr.next
  3. 循环交换: 重复步骤 2,直到 currNone
  4. 返回结果: 返回 prev 指向的节点,即交换后的链表头节点。

图解演示

为了更好地理解算法,我们使用图解来演示两两交换链表节点的过程:

初始链表:

1 -> 2 -> 3 -> 4

第一步:

prev: 1
curr: 2

第二步:

1 -> 4 -> 2 -> 3
prev: 1
curr: 4

第三步:

1 -> 4 -> 2 -> 3
prev: 4
curr: 2

第四步:

1 -> 4 -> 3 -> 2
prev: 4
curr: 3

第五步:

1 -> 4 -> 3 -> 2
prev: 3
curr: None

交换完成:

4 -> 1 -> 3 -> 2

代码实现

def swap_pairs(head):
    # 初始化指针
    prev = None
    curr = head

    while curr and curr.next:
        # 保存下一个节点
        next_pair = curr.next.next

        # 两两交换
        second = curr.next
        second.next = curr
        curr.next = next_pair

        # 更新指针
        if prev:
            prev.next = second
        else:
            head = second
        prev = curr
        curr = next_pair

    return head

复杂度分析

  • 时间复杂度: O(n),其中 n 为链表的长度。算法需要遍历整个链表一次。
  • 空间复杂度: O(1),算法不需要额外空间。

扩展应用

两两交换链表节点的算法在链表操作中有着广泛的应用场景,例如:

  • 逆转链表: 将链表中所有节点的顺序逆转。
  • 重排链表: 将链表重排为特定顺序,例如奇数节点在前,偶数节点在后。
  • 检测环形链表: 通过逐对交换节点的方式,可以快速检测链表中是否存在环路。

总结

两两交换链表节点的算法是一种巧妙而实用的链表操作技巧。通过理解其原理并掌握代码实现,我们可以轻松应对各种链表操作问题。算法的图解演示和扩展应用进一步加深了对算法的理解和应用范围。希望这篇文章能为你带来启发,助你提升算法编程能力!