返回

利剑出鞘:算法斗场,02.02题决胜倒数节点

前端

题目背景与挑战

在众多链表问题中,找到单向链表中的特定节点是一项常见任务。本篇将详细介绍如何解决 leetcode 中的 02.02 题,题目要求返回链表中的倒数第 k 个节点值。

链表基础回顾

单向链表是一种数据结构,由一系列结点(或元素)组成,每个结点包含一个指向下一个结点的数据指针。这种结构使得遍历和操作变得简单直接,但也带来了如访问特定位置的复杂度问题。

解决方案一:双指针法

使用双指针方法是最直观也是最高效的方式之一来解决此题。该方法通过两个指针共同移动的方式来确定倒数第 k 个节点的位置。

实现步骤

  1. 初始化两个指针,让第一个指针先走k步。
  2. 然后两个指针同时前进,直到第一个指针到达链表末尾时,第二个指针正好指向倒数第 k 个位置。

Python代码实现

# 定义单向链表的节点类
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def findKthToLast(head: ListNode, k: int) -> int:
    # 初始化两个指针,均指向链表头部
    first = head
    second = head
    
    # 让第一个指针先走k步
    for _ in range(k):
        if first is None:
            return -1  # 防止k大于链表长度的情况
        first = first.next

    # 当第一个指针到达末尾时,第二个指针恰好指向倒数第k个位置
    while first:
        first, second = first.next, second.next
        
    return second.val

解决方案二:递归法

使用递归方法也能达到同样效果。通过从链表头部开始递归遍历到尾部,然后在返回的过程中计数。

实现步骤

  1. 递归地访问链表的每个节点。
  2. 在每次回溯时增加一个计数器,当计数值等于 k 时返回该节点值。

Python代码实现

def findKthToLastRecursive(head: ListNode, k: int) -> int:
    count = [0]  # 使用列表来保持递归过程中对k的引用和修改
    
    def helper(node):
        if node is None:
            return -1
        
        val = helper(node.next)
        
        count[0] += 1
        if count[0] == k:
            return node.val
        
        return val

    return helper(head)

安全建议与注意事项

  • 在实现上述方法时,务必注意处理特殊情况,比如链表为空或k值大于链表长度的情况。
  • 确保递归深度不会超出限制。虽然在实际问题中不太可能遇到,但在编程竞赛或面试准备时,这一点仍需重视。

结语

通过以上两种方法的对比和代码实现,可以有效解决 leetcode 02.02 题目中的链表倒数节点查找问题。双指针法适用于大多数情况,而递归法则展示了另一种解决问题的方式。选择哪种方式取决于实际需要以及个人偏好。

希望这些内容能够帮助读者深入理解此题目的核心概念和解决方案,提升解决相似算法问题的能力。