解题思路:利用两个指针一次遍历列表,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针(快指针)到达链表的尾部时,第二个指针(慢指针)正好是倒数第k个节点,即两个指针刚好相差k步。
假设上面6个节点的链表倒数第3个个节点为所求节点,首先fast指针从表头开始向前走3-1=2步到达第3个节点,然后将solw指针初始化指向链表的第一个节点。最后让两个指针同时向前遍历,当fast指针到达链表的结尾时,slow指针指向的刚好是倒数第三个节点。
import java.util.*;
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0){
return null;
}
ListNode fast = head;
ListNode slow = head;
while(k-- > 1){ //对于非倒数第一个节点
if(fast.next != null){ //如果快指针后面还存在节点时
fast = fast.next;
}else{ //否则输出空
return null;
}
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
return slow; //返回慢指针所指元素即为倒数第k个节点
}
}