1. 链表OJ题解精讲
作为一名有多年数据结构教学经验的开发者,我深知链表相关算法题在面试和实际开发中的重要性。今天我将通过6道经典链表OJ题目,带大家深入理解链表操作的核心技巧。这些题目覆盖了快慢指针、链表反转、环形检测等关键知识点,都是面试中的高频考点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 返回倒数第k个节点
2.1 问题描述与解法分析
这道题目要求我们找到单向链表中倒数第k个节点的值。最直观的解法可能是先遍历链表得到长度n,再从头遍历n-k次。但这种方法需要两次遍历,时间复杂度为O(2n)。
更优的解法是使用快慢指针技巧:
- 初始化快慢指针都指向头节点
- 快指针先走k步
- 然后快慢指针同时前进
- 当快指针到达链表末尾时,慢指针正好指向倒数第k个节点
这种解法只需一次遍历,时间复杂度优化到O(n),空间复杂度为O(1)。
2.2 代码实现与细节处理
c复制int kthToLast(struct ListNode* head, int k) {
struct ListNode* fast = head, *slow = head;
// 快指针先走k步
while(k--) {
if(!fast) return -1; // 处理k大于链表长度的情况
fast = fast->next;
}
// 快慢指针同时前进
while(fast) {
slow = slow->next;
fast = fast->next;
}
return slow->val;
}
注意事项:
- 需要处理k大于链表长度的情况
- 链表为空时的边界条件
- k为0或负数时的输入校验
3. 链表的回文结构判断
3.1 解题思路分解
判断链表是否为回文结构,要求时间复杂度O(n),空间复杂度O(1)。我的解法分为三步:
- 使用快慢指针找到链表中点
- 反转链表的后半部分
- 比较前半部分和反转后的后半部分是否相同
3.2 关键代码实现
c复制struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head;
while(curr) {
struct ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
struct ListNode* middleNode(struct ListNode* head) {
struct ListNode *slow =
