剑指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 }

浙公网安备 33010602011771号