返回
剖析 LeetCode 题:找出链表中倒数第 k 个节点的奥秘
前端
2023-12-01 21:39:32
前言
在计算机科学领域,链表是一种广泛使用的数据结构,用于存储和组织数据。在 LeetCode 中,题号为剑指 Offer 22 的问题要求我们找出链表中倒数第 k 个节点。
题目详解
让我们首先理解题目中的关键概念:
- 倒数第 k 个节点: 从链表尾部开始计数,第 k 个节点。
- 链表: 一个由一系列节点组成的线性数据结构,其中每个节点包含一个值和指向下一个节点的指针。
解决方法
要解决此问题,我们可以使用两种主要方法:
1. 双指针法:
- 使用两个指针,
fast
和slow
,同时从链表头部开始。 - 将
fast
指针移动k
步。 - 现在,同时移动
fast
和slow
指针,直到fast
指针到达链表尾部。 - 此此时刻,
slow
指针将指向倒数第 k 个节点。
2. 递归法:
- 将链表作为参数传递给递归函数。
- 找到递归函数的终止条件,即当链表为空时。
- 递增
k
并递归调用函数,并传入子链表。 - 当
k
为 0 时,返回当前节点。
代码实现
# 双指针法
def find_kth_to_last_node(head, k):
fast, slow = head, head
for _ in range(k):
fast = fast.next
while fast is not None:
fast, slow = fast.next, slow.next
return slow
# 递归法
def find_kth_to_last_node_recursive(head, k):
if head is None:
return None
node = find_kth_to_last_node_recursive(head.next, k)
if node is None:
k -= 1
if k == 0:
return head
return node
示例
考虑一个链表,其节点值依次为 [1, 2, 3, 4, 5],倒数第 2 个节点为 4。
双指针法:
fast
指针移动 2 步,指向 3。fast
和slow
指针同时移动,直到fast
指针到达尾部 5。- 此 时刻,
slow
指针指向 4。
递归法:
- 递增
k
并递归调用函数,传入子链表 [2, 3, 4, 5]。 - 继续递归,直到
k
为 0,此时返回 4。
结论
剑指 Offer 22 要求我们找到链表中倒数第 k 个节点,这可以用双指针法或递归法解决。了解不同算法的优缺点,并选择最适合您具体需求的方法非常重要。