返回单向链表倒数第 k 个结点

Posted 恋喵大鲤鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了返回单向链表倒数第 k 个结点相关的知识,希望对你有一定的参考价值。

文章目录

1.问题描述

返回单向链表倒数第 k 个结点(一次遍历)。

示例:

输入: 1->2->3->4->5 和 k = 2
输出: 4

2.难度等级

easy

3.热门指数

★★★★★

这是一道关于链表的经典面试题。鄙人于 2022 年在虾皮一面时遇到,非常热门,必须掌握

4.解题思路

前后双指针。前指针先走 k 个结点,后指针再从头结点开始与前指针一起向前移动,直到前指针遍历完链表。此时后指针的位置便是倒数第 k 个结点。

时间复杂度:

O(n),其中 n 为链表长度,遍历链表需线性 O(n) 时间。

空间复杂度:

O(1),双指针 pre , cur 使用常数大小的额外空间。

5.实现示例

下面以 Golang 为例,给出实现示例。

type ListNode struct 
	v int
	next *ListNode


// kthToLast 返回单向链表倒数第 k 个结点。
func kthToLast(head *ListNode, k int) *ListNode 
	pre, cur := head, head
	var n int
	for pre != nil 
		n++
		pre = pre.next
		if n > k 
			cur = cur.next
		
	
	return cur

验证:

func main() 
	// 创建链表 1->2->3->4->5。
	head := &ListNodev: 1
	cur := head
	for i := 2; i <= 5; i++ 
		cur.next = &ListNodev: i
		cur = cur.next
	

	// 返回单向链表倒数第 1 个结点(5)。
	node := kthToLast(head, 1)
	fmt.Println(node.v)

	// 返回单向链表倒数第 2 个结点(4)。
	node = kthToLast(head, 2)
	fmt.Println(node.v)

	// 返回单向链表倒数第 3 个结点(3)。
	node = kthToLast(head, 3)
	fmt.Println(node.v)

输出:

5
4
3

参考文献

面试题02.02. 返回倒数第k 个节点题解- 力扣(LeetCode)

以上是关于返回单向链表倒数第 k 个结点的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ51输出单向链表中倒数第k个结点

华为机试题 HJ51输出单向链表中倒数第k个结点

链表中倒数第K个结点

链表的倒数第k个节点

输入一个单向链表,输出该链表中倒数第k个结点

单向列表的倒数第k个结点的值 python实现