剑指offer22:链表中倒数第k个节点

题目描述:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

 

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

 

分析:要找出链表倒数第k个节点,但是不遍历链表一次不知道链表有多少个节点,得到链表节点总数后,还要再遍历才能找到倒数第k个节点,显然不好。可以用链表经典的双指针思路,第一个指针先走k-1步,第二个指针先不动,等到第k个节点的时候,两个指针一起跑,等第一个指针到达链表尾节点的时候,第二个之指针刚好是第k个节点。go代码实现:

 1 /**
 2  * Definition for singly-linked list.
 3  * type ListNode struct {
 4  *     Val int
 5  *     Next *ListNode
 6  * }
 7  */
 8 func getKthFromEnd(head *ListNode, k int) *ListNode {
 9     //输入有效性检查,题目描述从计数从1开始,所以k<1属于无效输入
10     if head == nil || k < 1 {
11         return nil
12     }
13 
14     //定义两个指针,第一个指针先走k-1步,到第k步的时候两个指针一起走,当先走的指针到达链表末尾的时候,
15     //慢指针刚好是第k个节点,首先让两个指针都指向链表头部
16     fast := head
17     low := head
18     //快指针先走k-1步
19     for i := 0; i < k - 1; i++ {
20         if fast.Next != nil {
21             fast = fast.Next
22         } else {
23             //如果输入链表的节点数比k少,那就也找不出来了
24             return nil
25         }
26     }
27     //快慢指针一起走
28     for fast.Next != nil {
29         fast = fast.Next
30         low = low.Next
31     }
32 
33     return low
34 }

 

posted @ 2022-02-05 18:04  星星里的花  阅读(24)  评论(0)    收藏  举报