我的测试学习站TEST LEARNING HUB
开始学习
首页/精华文章/7. 链表题面试怎么讲

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 虚拟头节点简化头节点处理。链表题最重要的是讲清指针变化和返回值。

十、练习清单

  1. 定义链表节点;
  2. 遍历链表;
  3. 反转链表;
  4. 判断是否有环;
  5. 找中间节点;
  6. 合并两个有序链表;
  7. 删除指定节点;
  8. 使用 dummy 节点;
  9. 画图解释指针变化;
  10. 准备链表面试表达。

链表题不要硬背。把指针关系画清楚,处理好空节点和返回值,大多数基础链表题都能稳住。

配套刷题: