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

题目

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

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


示例:

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

返回链表 4->5.

思路

两次遍历

首先想到的就是先遍历一遍,拿到总节点的数量,然后减去k,便得到我们要正向遍历第几个节点,然后在遍历一次

时间复杂度:O(2n)= O(n)

空间复杂度:O(1)

双指针

设定两个指针之间的差值为(k-1),快的指针从头遍历到尾,则慢指针刚到到倒数k的位置

实现

两次遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private static class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
int size = 0;
ListNode temp = head;
while (temp.next != null) {
size++;
temp = temp.next;
}
size = size - k + 1;
while (size-- > 0) {
assert head != null;
head = head.next;
}
return head;
}
}

双指针:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private static class Solution2 {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head;
for (int i = 0; i < k - 1; i++) {
fast = fast.next;
}

while (fast.next != null) {
slow = slow.next;
fast = fast.next;
}

return slow;
}
}