如何用递归在 Go 中寻链表尾 K 个节点之根?
- 内容介绍
- 文章标签
- 相关推荐
:为何递归查找链表倒数第 K 个节点会让人头疼?
在实际开发中,常见的痛点包括:
-
忘记在递归入口检查
nil导致空指针异常。 - 递归终止条件写得不明确,容易出现无限递归或提前返回。
- 计数器的传递方式不当,使得最终返回的节点不是期望的倒数第 K 个。
- 对 Go 中指针传值机制不了解,导致对链表结构的修改未生效。老实说,
问题描述
给定一个单向链表的头指针 head还有正整数 K返回链表中倒数第 K 个节点。如果链表长度小于 K则返回 nil。
示例
// 链表: 1 → 2 → 3 → 4 → 5
// K = 2
// 返回值应为节点值 4
链表节点结构体定义
type ListNode struct {
Val int
Next *ListNode
}
递归解法主要思路
思路概述:
- 从头结点开始递归遍历至链表末尾。
- 每次函数返回时携带当前已经遍历过的节点计数。
-
当计数等于
K时即可确定当前节点为倒数第 K 个。 - 利用 Go 的多返回值。把计数和目标节点一起返回,避免全局变量带来的副作用。
:为何递归查找链表倒数第 K 个节点会让人头疼?
在实际开发中,常见的痛点包括:
-
忘记在递归入口检查
nil导致空指针异常。 - 递归终止条件写得不明确,容易出现无限递归或提前返回。
- 计数器的传递方式不当,使得最终返回的节点不是期望的倒数第 K 个。
- 对 Go 中指针传值机制不了解,导致对链表结构的修改未生效。老实说,
问题描述
给定一个单向链表的头指针 head还有正整数 K返回链表中倒数第 K 个节点。如果链表长度小于 K则返回 nil。
示例
// 链表: 1 → 2 → 3 → 4 → 5
// K = 2
// 返回值应为节点值 4
链表节点结构体定义
type ListNode struct {
Val int
Next *ListNode
}
递归解法主要思路
思路概述:
- 从头结点开始递归遍历至链表末尾。
- 每次函数返回时携带当前已经遍历过的节点计数。
-
当计数等于
K时即可确定当前节点为倒数第 K 个。 - 利用 Go 的多返回值。把计数和目标节点一起返回,避免全局变量带来的副作用。

