返回

剖析 LeetCode 题:找出链表中倒数第 k 个节点的奥秘

前端

前言

在计算机科学领域,链表是一种广泛使用的数据结构,用于存储和组织数据。在 LeetCode 中,题号为剑指 Offer 22 的问题要求我们找出链表中倒数第 k 个节点。

题目详解

让我们首先理解题目中的关键概念:

  • 倒数第 k 个节点: 从链表尾部开始计数,第 k 个节点。
  • 链表: 一个由一系列节点组成的线性数据结构,其中每个节点包含一个值和指向下一个节点的指针。

解决方法

要解决此问题,我们可以使用两种主要方法:

1. 双指针法:

  • 使用两个指针,fastslow,同时从链表头部开始。
  • fast 指针移动 k 步。
  • 现在,同时移动 fastslow 指针,直到 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。
  • fastslow 指针同时移动,直到 fast 指针到达尾部 5。
  • 此 时刻,slow 指针指向 4。

递归法:

  • 递增 k 并递归调用函数,传入子链表 [2, 3, 4, 5]。
  • 继续递归,直到 k 为 0,此时返回 4。

结论

剑指 Offer 22 要求我们找到链表中倒数第 k 个节点,这可以用双指针法或递归法解决。了解不同算法的优缺点,并选择最适合您具体需求的方法非常重要。