1. 问题背景与需求分析
在技术面试中,链表相关题目一直是考察候选人基础算法能力的重点。"返回倒数第k个节点"这道经典题目看似简单,却能有效检验面试者对指针操作、边界条件处理等基本功的掌握程度。实际开发中,类似场景也常见于日志分析、数据流处理等需要访问特定偏移量元素的场景。
这道题的核心要求是:给定一个单向链表,返回链表中倒数第k个节点的值。例如链表1->2->3->4->5,当k=2时,应返回节点4。题目通常要求只遍历链表一次,且空间复杂度为O(1)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法思路与双指针解法
2.1 暴力解法的局限性
最直观的解法是先遍历链表获取长度n,再从头遍历到第n-k个节点。这种方法需要两次遍历,虽然时间复杂度仍是O(n),但不符合"只遍历一次"的进阶要求。
python复制# 两遍扫描解法示例(不推荐)
def getKthFromEnd(head, k):
length = 0
curr = head
while curr:
length += 1
curr = curr.next
curr = head
for _ in range(length - k):
curr = curr.next
return curr
2.2 双指针的巧妙运用
更优的解法是使用快慢双指针:
- 初始化两个指针fast和slow都指向头节点
- 先让fast向前移动k步
- 然后fast和slow同时移动,直到fast到达链表末尾
- 此时slow指向的就是倒数第k个节点
这种方法的精妙之处在于通过指针间距的保持,将位置关系转换为相对距离:
python复制def getKthFromEnd(head, k):
fast = slow = head
for _ in range(k):
if not fast: # 处理k大于链表长度的情况
return None
fast = fast.next
while fast:
fast = fast.next
slow = slow.next
