1. 问题概述与核心挑战
回文链表判断是算法面试中的经典问题,题目看似简单却暗藏玄机。给定一个单链表的头节点,要求判断链表节点值的排列是否构成回文结构。所谓回文,就是正读反读都相同的序列,比如 [1,2,2,1] 或 [1,2,3,2,1]。
这个问题的难点在于单链表的特性限制:
- 单向遍历:只能从头节点开始逐个访问,无法直接获取前驱节点
- 空间限制:进阶要求O(1)空间复杂度,排除了使用额外数据结构存储的思路
- 边界处理:需要正确处理奇数长度和偶数长度链表的不同情况
在实际面试中,面试官通常会先让候选人描述基础解法,然后逐步引导到最优解。根据我的面试经验,约70%的候选人能想到O(n)空间的解法,但只有不到30%能独立推导出O(1)空间的最优解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法:数组+双指针法
2.1 算法思路
这是最直观的解法,分为三个步骤:
- 遍历链表,将所有节点值存入数组
- 初始化两个指针,分别指向数组首尾
- 向中间移动指针,比较对应位置的值是否相等
2.2 Java实现
java复制public boolean isPalindrome(ListNode head) {
List<Integer> values = new ArrayList<>();
// 将链表值复制到数组
ListNode curr = head;
while (curr != null) {
values.add(curr.val);
curr = curr.next;
}
// 双指针判断回文
int left = 0, right = values.size() - 1;
while (left < right) {
if (!values.get(left).equals(values.get(right))) {
return false;
}
left++;
right--;
}
return true;
}
2.3 复杂度分析
- 时间复杂度:O(n),遍历链表和数组各一次
- 空间复杂度:
