剑指 Offer 22. 链表中倒数第k个节点

1. 题目

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

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

 2. 示例

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

 3. 题解

本题给了两种解法。

  • 两次查找:先计算总节点个数,然后输出再次遍历到n - k + 1,然后输出。
  • 快慢指针:先让快指针走到k步,然后快慢指针同时走,快指针走到尾时,满指针刚好到达倒数k位置。

4. 实现

 1 class Solution {
 2     // 两次查找
 3     public ListNode getKthFromEndA(ListNode head, int k) {
 4         if(head == null) return null;
 5         ListNode temp = head;
 6         int n = 0;
 7         // 第一遍计数
 8         while (temp != null) {
 9             n++;
10             temp = temp.next;
11         }
12         // 如果k > n,说明所有的都满足条件
13         if(k >= n) {
14             return head;
15         }
16         // 遍历到n - k + 1,直接打印
17         int cur = 1, dis = n - k + 1;
18         while(cur <= dis) {
19             if(cur == dis) {
20                 return head;
21             }
22             head = head.next;
23             cur++;
24         }
25         return head;
26     }
27     // 快慢指针
28     public ListNode getKthFromEndB(ListNode head, int k) {
29         // 定义快慢指针
30         ListNode frontNode = head, behindNode = head;
31         // 快指针先走k步
32         while (frontNode != null && k > 0) {
33             frontNode = frontNode.next;
34             k--;
35         }
36         // 快慢指针同时走,他们的距离刚好为k,当快指针走到尾时,结束。
37         // 此时满指针刚好走到倒数倒数第k个节点。
38         while (frontNode != null) {
39             frontNode = frontNode.next;
40             behindNode = behindNode.next;
41         }
42         return behindNode;
43     }
44 }
View Code

5. 结语

  努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

  如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

posted @ 2021-07-07 09:38  抚琴尘世客  阅读(36)  评论(0编辑  收藏  举报