234. 回文链表(Palindrome Linked List)

难度:简单 | 主题:链表、双指针、反转

题目

请判断一个链表是否为回文链表。

示例

 
输入:head = [1,2,2,1]
 
输出:True
 
输入:head = [1,2]
 
输出:False
 

思路

先讲个故事:对折看对称

你有一串珠子,想知道是不是左右对称的。最简单的办法:找到中间,把后半截倒过来,然后和前半截一对比。

就像拿一张纸对折——左右两半完全重合就是对称。


引导式推导:从数组到反转

第 1 层:转成数组(直观但费空间)

遍历链表存到数组,然后双指针从两端往中间对比。O(n) 空间。

第 2 层:快慢指针 + 反转后半(O(1) 空间)

 
[1, 2, 3, 2, 1]
 
第一步:快慢指针找中点
 
slow → 3
 
第二步:反转后半
 
[1, 2] 和 [1, 2, 3] → 反转后半得到 [1, 2]
 
第三步:逐节点比较
 
1 vs 1 ✅  2 vs 2 ✅  3(后半已走完,不用比)
 

偶数情况:

 
[1, 2, 2, 1]
 
第一步:slow → 第二个 2
 
第二步:反转后半得到 [1, 2]
 
第三步:1 vs 1 ✅  2 vs 2 ✅
 

graph LR

    subgraph 三步法检回文

        A["①→②→③→②→①"] --> B["找中点<br/>slow=③"]

        B --> C["反转后半<br/>②'→①'"]

        C --> D["比较<br/>①=①' ✅<br/>②=②' ✅"]

    end

    style D fill:#ffd700

解法时间空间
转数组O(n)O(n)
快慢指针+反转O(n)O(1)

代码

 
def isPalindrome(self, head):
 
    if not head or not head.next:
 
        return True
 
    # 第一步:快慢指针找中点
 
    slow = fast = head
 
    while fast and fast.next:
 
        slow = slow.next
 
        fast = fast.next.next
 
    # 第二步:反转后半段
 
    prev = None
 
    curr = slow
 
    while curr:
 
        nxt = curr.next
 
        curr.next = prev
 
        prev = curr
 
        curr = nxt
 
    # 第三步:逐节点比较
 
    left = head
 
    right = prev
 
    while right:
 
        if left.val != right.val:
 
            return False
 
        left = left.next
 
        right = right.next
 
    return True
 

复杂度

指标解释
时间O(n)找中点 + 反转 + 比较,各 O(n)
空间O(1)几个指针

实战考量

频率分析

出现在:字节/美团常考,约 30% 的 AI Agent 常会出这题。考察快慢指针 + 反转两个基本功的组合。

延伸思考

Q:如果要求恢复链表呢?

A:比较完后再反转一次后半段,把链表恢复原状。实践中提一嘴”工程中需要恢复”,展示严谨性。

Q:用递归怎么做?

A:递归到尾节点,然后和头节点比较,回溯时头节点后移。空间 O(n)。

Q:奇数长度时中间节点怎么处理?

A:中间节点在反转后半后变成尾节点,不影响前半段的比较(循环只到 right 走完)。

Q:快慢指针条件为什么是 while fast and fast.next

A:偶数长度时 fast 最终为 None,odd 长度时 fast.next 为 None。两种都要处理。

易错点

  • 快慢指针条件写错(fast.next and fast.next.next),导致偶数长度时中点不对

  • 奇数长度中间节点是否需要参与比较?不需要

  • 比较时以 right 为循环条件


生活类比

回文链表 → 对折看对称

找中点就像找到珠串的中间,反转后半就像把后半截倒过来。两半一对比就知道是不是对称的——回文就是链表界的”左右脸对称”。


相关题目

题目关系
206反转链表反转基本功
125验证回文串回文校验数组版

→ 返回题单:LeetCode学习路线图 > 四、链表

速记卡(面试闪卡)

Q1:一句话讲清「234. 回文链表(Palindrome Linked List)」到底是什么?

A:判断链表正读反读是否一致,即左右对称(Palindrome,回文)。

Q2:思路 —— 怎么理解?

A:像对折纸:找中点把后半反转,再与前半逐节点比对(Fast-Slow Pointer,快慢指针)。

Q3:代码 —— 怎么理解?

A:快慢指针找中点,反转后半段,以 right 为界逐节点比较(Reverse Linked List,反转链表)。

Q4:复杂度 —— 怎么理解?

A:时间 O(n) 找中点+反转+比较,空间 O(1) 仅若干指针(Time/Space Complexity,时空复杂度)。

Q5:实战考量 —— 怎么理解?

A:字节美团常考,组合快慢指针与反转两个基本功(In-place,原地)。

Q6:核心速记主线有哪些?

  • 回文即左右对称,比较前后半

  • 转数组 O(n) 空间;快慢+反转 O(1)

  • 奇数中间节点不参与比较

  • 比较时以 right 为循环条件

口诀

A:回文链表怎么判

快慢指针找中点

反转后半再比拼

对折对称一眼明

相关链接