1. 回文链表问题解析
回文链表是算法面试中的经典问题,主要考察对链表数据结构的理解和双指针技巧的掌握。题目要求我们判断一个单链表是否为回文结构,即正读和反读都相同的链表。
1.1 问题定义与示例分析
回文链表的基本定义是:链表的节点值序列从前往后读和从后往前读完全一致。例如:
- [1,2,2,1] 是回文链表
- [1,2] 不是回文链表
这个问题看似简单,但由于链表的单向性(只能从头节点开始顺序访问),使得判断回文比数组或字符串要复杂得多。特别是题目要求O(1)空间复杂度时,我们不能简单地将链表值复制到数组中再判断。
1.2 基础解法思路
最直观的解法是将链表值复制到数组中,然后用双指针法判断数组是否为回文。这种方法时间复杂度O(n),空间复杂度O(n)。虽然简单,但不满足进阶要求。
cpp复制bool isPalindrome(ListNode* head) {
vector<int> vals;
while (head != nullptr) {
vals.push_back(head->val);
head = head->next;
}
int left = 0, right = vals.size() - 1;
while (left < right) {
if (vals[left] != vals[right]) return false;
left++;
right--;
}
return true;
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 进阶解法:O(1)空间复杂度实现
2.1 算法核心思路
要实现O(1)空间复杂度,我们需要在不使用额外空间的情况下判断回文。关键思路是:
- 找到链表的中点(使用快慢指针)
- 反转后半部分链表
- 比较前半部分和反转后的后半部分
- 恢复链表(可选)
2.2 关键步骤详解
2.2.1 寻找链表中点
使用快慢指针技巧:快指针每次走两步,慢指针每次走一步。当快指针到达末尾时,慢指针正好在中点。
cpp复制ListNode* endOfFirstHalf(ListNode* head) {
Li
