题目
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
示例:
1 | 给定一个链表: 1->2->3->4->5, 和 k = 2. |
解题
这是一道经典的双指针问题中的「快慢指针」问题,只要提炼出问题核心点,这道题很快便能解开。
题目是要求输出该链表中倒数第k个几点,很多人看到题目后的第一反应可能是反转链表。将链表反转后,再走到第k的位置,这确实是一种思路,但时间复杂度和空间复杂度都太高了,如果题目中对复杂度有明确规定,那这就行不通。
但如果用快慢指针来解决这个问题,就很轻松了,我们来看看如何解题。
1 | /** |
核心思路就是:让快指针先走k步,然后快慢指针再同时出发。这样做的目的是,快指针永远在前面,只要它走到链表末尾,那么它身后落后k个身位的慢指针的位置就是倒数第k个节点了。这样一来,我们只需要一遍就能找到倒数第k个节点,是不是很赞。