最优解:快慢指针
public ListNode finfKthToTail(int k){
if(k<=0||k>size()){
return null;
}
ListNode fast=head;
ListNode slow=head;//让快慢指针在起始位置
//先让fast走k-1步
for(int i=0;i<k-1;i++){
fast=fast.next;
}
//fast和slow同时走到fast.next=null
while (fast.next!=null){
slow=slow.next;
fast=fast.next;
}
return slow;
}
这个函数的算法思想是基于快慢指针(也称为“龟兔赛跑”算法)来找到链表中倒数第 k
个节点的。具体算法思想如下:
- 参数检查:首先,函数检查传入的
k
值是否有效。如果k
小于等于0或者大于链表的长度(这里假设size()
函数能够返回链表的长度),则直接返回null
,因为这两种情况下都无法找到有效的倒数第k
个节点。 - 初始化指针:然后,函数初始化两个指针
fast
和slow
,都指向链表的头节点head
。这两个指针将用于在链表上移动,以找到倒数第k
个节点。 - 快指针先行:接下来,函数通过一个循环让快指针
fast
先行移动k-1
步。这个步骤的目的是让快指针和慢指针之间拉开k-1
个节点的距离。这样,当快指针到达链表末尾(即fast.next == null
)时,慢指针slow
将位于链表的倒数第k
个节点上。 - 快慢指针同步移动:在快指针先行
k-1
步之后,函数进入一个while
循环,让快指针fast
和慢指针slow
同时向前移动,直到快指针到达链表的末尾(即fast.next == null
)。在这个过程中,由于快指针比慢指针多走了k-1
步,因此当快指针到达末尾时,慢指针正好位于倒数第k
个节点上。 - 返回结果:最后,函数返回慢指针
slow
所指向的节点,即链表的倒数第k
个节点。