7. 链表题面试怎么讲
链表题是手撕代码中比较容易让测试同学紧张的题型,因为它不像数组有下标,核心是节点和指针变化。测试岗面试通常不会考特别复杂的链表题,但反转链表、判断是否有环、合并两个有序链表、找中间节点这些基础题要会讲、会写、会验证。
链表题的关键不是背代码,而是画清楚指针变化。面试时可以边画边讲:当前节点是谁、前驱节点是谁、下一个节点怎么保存、什么时候移动。只要指针关系清楚,代码就不难。
一、链表基础结构
单链表节点通常包含 value 和 next。
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
链表通过 next 串起来,不能像数组一样直接按下标访问。
二、链表题先确认什么
拿到链表题先确认:
- 链表是否可能为空;
- 是否只有一个节点;
- 是否需要原地修改;
- 是否可能有环;
- 返回头节点还是布尔值;
- 是否允许额外空间。
空链表和单节点是最常见边界。
三、反转链表
经典题:把 1 -> 2 -> 3 反转成 3 -> 2 -> 1。
def reverse_list(head):
prev = None
curr = head
while curr:
next_node = curr.next
curr.next = prev
prev = curr
curr = next_node
return prev
解释:
- prev 保存已反转部分的头;
- curr 是当前节点;
- next_node 先保存下一个节点,避免断链;
- 改 curr.next 指向 prev;
- prev 和 curr 向后移动。
四、判断链表是否有环
用快慢指针。快指针每次走两步,慢指针每次走一步。如果有环,二者会相遇。
def has_cycle(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
边界:空链表、单节点无环、单节点自环、多节点有环。
五、找链表中间节点
也用快慢指针。
def middle_node(head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
快指针走到末尾时,慢指针在中间。
六、合并两个有序链表
使用虚拟头节点 dummy。
def merge_two_lists(l1, l2):
dummy = ListNode(0)
curr = dummy
while l1 and l2:
if l1.val <= l2.val:
curr.next = l1
l1 = l1.next
else:
curr.next = l2
l2 = l2.next
curr = curr.next
curr.next = l1 if l1 else l2
return dummy.next
dummy 可以简化头节点处理。
七、链表题常见技巧
1. dummy 虚拟头节点
适合删除节点、合并链表,避免头节点特殊判断。
2. 快慢指针
适合找中点、判断环。
3. 保存 next
反转链表时一定要先保存 next,否则会断链。
4. 画图
链表题建议面试时画图辅助说明。
八、链表题常见错误
- 忘记处理空链表;
- 忘记保存 next;
- 返回了原 head 而不是新 head;
- while 条件写错;
- 快指针没有判断 fast.next;
- 修改指针后丢失后续节点。
九、面试回答模板
如果面试官问“链表题面试怎么讲”,可以这样回答:
链表题我会先画节点关系,再写代码。重点关注空链表、单节点和指针断链问题。反转链表时用 prev、curr、next_node 三个变量,先保存 next,再把 curr.next 指向 prev,最后移动指针;判断是否有环用快慢指针,快指针每次两步,慢指针每次一步,相遇说明有环;合并两个有序链表可以用 dummy 虚拟头节点简化头节点处理。链表题最重要的是讲清指针变化和返回值。
十、练习清单
- 定义链表节点;
- 遍历链表;
- 反转链表;
- 判断是否有环;
- 找中间节点;
- 合并两个有序链表;
- 删除指定节点;
- 使用 dummy 节点;
- 画图解释指针变化;
- 准备链表面试表达。
链表题不要硬背。把指针关系画清楚,处理好空节点和返回值,大多数基础链表题都能稳住。
配套刷题:

