1. 问题背景与需求分析
在技术面试中,链表相关算法题出现的频率相当高。这道"返回倒数第k个节点"的问题,看似简单却暗藏玄机,能有效考察面试者对指针操作和时间复杂度的理解。我在实际面试中多次使用这道题,发现约60%的候选人初次接触时都无法给出最优解。
问题的核心需求很明确:给定一个单向链表,要求返回链表中倒数第k个节点的值。例如链表1->2->3->4->5,当k=2时,应返回节点4的值。这个操作在实际开发中有广泛应用场景,比如日志系统中获取最近N条记录、监控系统中检查特定时间窗口的数据等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常见解法与性能分析
2.1 暴力解法:两次遍历
最直观的解法是先遍历链表获取长度n,再从头遍历到第n-k个节点。这种方法容易理解但效率不高:
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
时间复杂度:O(2n) → O(n)
空间复杂度:O(1)
虽然时间复杂度是线性的,但需要完整遍历链表两次。当链表长度很大时,这种解法就显得不够优雅。
2.2 优化解法:双指针技巧
更高效的解法是使用快慢双指针,只需一次遍历:
python复制def getKthFromEnd(head, k):
fast = slow = head
for _ in range(k):
fast = fast.next
while fast:
slow = slow.next
fast = fast.next
return slow
时间复杂度:O(n)
空间复杂度:O(1)
快指针先走k步,然后两个指针同步前进。当快指针到达末尾时,慢指针正好指向倒数第k个节点。这种方法将遍历次数减少到一次,是面试官期望看到的解法。
注
