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 }
5. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。