链表算法题常见解题方法总结(面试高频模板)
前言
数组题考察的是下标操作,而链表题考察的核心永远是指针操作。
很多同学刷链表的时候会发现:
- 题目千变万化;
- 解法却总是在重复。
因为链表题真正高频的方法只有几个:
- 哨兵节点(Dummy Node)
- 快慢指针(Fast & Slow Pointer)
- 指针反转
- 双指针遍历
- 递归
- 分治
掌握这些技巧,大部分链表题都能快速找到思路。
一、哨兵节点(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
全部统一处理。
高频题目
-
- 删除链表的倒数第 N 个节点
-
- 两两交换链表中的节点
-
- 移除链表元素
-
- 反转链表 II
-
- 合并两个有序链表
使用模板
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
高频题目
-
- 反转链表
-
- 反转链表 II
-
- K 个一组翻转链表
-
- 回文链表
四、递归思想
核心思想
先处理子问题,再处理当前节点。
模板
python
def dfs(node):
if not node:
return
dfs(node.next)
高频题目
- 反转链表
- 合并链表
- 排序链表
五、分治思想
核心思想
把链表拆成两部分处理。
高频题目
-
- 排序链表
-
- 合并 K 个升序链表
六、链表题万能思考顺序
做题时先问自己:
第一步
能不能加 Dummy?
第二步
能不能用快慢指针?
第三步
能不能反转?
第四步
能不能递归?
第五步
能不能分治?
总结
链表题虽然题目很多,但真正高频的方法只有几个:
- 哨兵节点
- 快慢指针
- 指针反转
- 递归
- 分治
掌握这些模板之后,大部分链表题都能快速找到突破口。