目录
1.题目
2.思路
核心思路:快慢指针
目标:我们的目标就是:当快指针走完整个链表时,慢指针刚好走到倒数第K个节点
例如我们要找倒数第2个节点
始:
终:
由此我们可以发现,在快指针走完时fast与slow之间间隔k-1个节点。
那么我们就可以先让快指针走k步,此时快慢指针之间相差k-1个节点
随后让快慢指针同时向后走,当快指针走完时,慢指针与快指针相差k-1个节点,此时慢指针就为我们需要得到的倒数第K个节点
3.代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(k<0) {
return null;//判断k的合法性
}
ListNode fast = head;//快慢指针初始都指向头
ListNode slow = head;
while(k-- != 0){
fast = fast.next;//快指针先向前走k步,与慢指针之间相差k-1个节点
}
while(fast != null) {
slow = slow.next;
fast = fast.next;
//此时快慢指针一起走
}
//循环结束时,快指针走完,慢指针走到倒数第K个位置
return slow;
}