题目: 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
一般思路是:先走到链表的尾端,再回溯k步,但由于是单向链表,该思路行不通。另一个思路是,假设链表有n个结点,倒数第k个,就是从头开始第n-k+1个结点,这个不难,遍历链表第一次得到结点个数n,遍历第二次得到第n-k+1个结点。
更好的思路是:只遍历链表一次就能找到倒数第k个结点,我们可以定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针不动;从第k步开始,第二个指针也开始从链表头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点时,第二个指针正好是倒数第k个结点。
public static ListNode findKthToTail(ListNode head,int k){
if(head==null || k==0) return null;
ListNode first = head;
ListNode behind = head;
for(int i=0; i<k-1; i++){
if(first.next!=null)
first = first.next;
else{
return null;
}
}
while(first.next!=null){
first = first.next;
behind = behind.next;
}
return behind;
}