链表算法题常见解题方法总结(面试高频模板)

链表算法题常见解题方法总结(面试高频模板)

前言

数组题考察的是下标操作,而链表题考察的核心永远是指针操作

很多同学刷链表的时候会发现:

  • 题目千变万化;
  • 解法却总是在重复。

因为链表题真正高频的方法只有几个:

  1. 哨兵节点(Dummy Node)
  2. 快慢指针(Fast & Slow Pointer)
  3. 指针反转
  4. 双指针遍历
  5. 递归
  6. 分治

掌握这些技巧,大部分链表题都能快速找到思路。


一、哨兵节点(Dummy Node)

核心思想

在原链表前面人为增加一个虚拟节点。

text 复制代码
dummy -> 1 -> 2 -> 3

代码:

python 复制代码
dummy = ListNode(0, head)

为什么需要?

因为头节点比较特殊。

例如:

删除节点2:

text 复制代码
1 -> 2 -> 3

可以直接:

python 复制代码
pre.next = pre.next.next

但是删除节点1:

text 复制代码
1 -> 2 -> 3

需要:

python 复制代码
head = head.next

逻辑完全不同。

加入 dummy 后:

text 复制代码
dummy -> 1 -> 2 -> 3

删除任何节点:

python 复制代码
pre.next = pre.next.next

全部统一处理。


高频题目

    1. 删除链表的倒数第 N 个节点
    1. 两两交换链表中的节点
    1. 移除链表元素
    1. 反转链表 II
    1. 合并两个有序链表

使用模板

python 复制代码
dummy = ListNode(0, head)
cur = dummy

return dummy.next

二、快慢指针(Fast & Slow Pointer)

核心思想

两个指针速度不同:

python 复制代码
slow = slow.next
fast = fast.next.next

利用速度差解决问题。


应用一:寻找链表中点

python 复制代码
while fast and fast.next:
    slow = slow.next
    fast = fast.next.next

当循环结束:

python 复制代码
slow

就在链表中间。


应用二:删除倒数第 N 个节点

先让:

python 复制代码
fast

走 N 步。

然后:

python 复制代码
fast
slow

一起走。

当:

python 复制代码
fast

到达末尾:

python 复制代码
slow

刚好位于待删除节点的前驱。


应用三:判断链表有环

如果存在环:

text 复制代码
快指针一定会追上慢指针。

应用四:寻找环的入口

第一次相遇后:

python 复制代码
p = head

然后:

python 复制代码
p = p.next
slow = slow.next

再次相遇的位置就是环入口。


三、指针反转

核心思想

改变 next 指向。


模板

python 复制代码
pre = None
cur = head

while cur:
    nxt = cur.next
    cur.next = pre
    pre = cur
    cur = nxt

return pre

高频题目

    1. 反转链表
    1. 反转链表 II
    1. K 个一组翻转链表
    1. 回文链表

四、递归思想

核心思想

先处理子问题,再处理当前节点。


模板

python 复制代码
def dfs(node):
    if not node:
        return

    dfs(node.next)

高频题目

  • 反转链表
  • 合并链表
  • 排序链表

五、分治思想

核心思想

把链表拆成两部分处理。


高频题目

    1. 排序链表
    1. 合并 K 个升序链表

六、链表题万能思考顺序

做题时先问自己:

第一步

能不能加 Dummy?

第二步

能不能用快慢指针?

第三步

能不能反转?

第四步

能不能递归?

第五步

能不能分治?


总结

链表题虽然题目很多,但真正高频的方法只有几个:

  • 哨兵节点
  • 快慢指针
  • 指针反转
  • 递归
  • 分治

掌握这些模板之后,大部分链表题都能快速找到突破口。