题目描述:
输入一个链表,输出该链表中倒数第k个结点。
思路:制造了一个K长度的尺子,把尺子从头往后移动,当尺子的右端与链表的末尾对齐的时候,尺子左端所在的结点就是倒数第k个结点
首先想到的是使用两个指针,遍历两次,第一次求得head的长度N 然后第二次遍历求N-K+1
但要求只能使用一次遍历
快慢指针问题,则定义两个指针,一个先走K-1步,然后第二个开始走,当第一个走到尽头的时候,第二个刚好走到N-K+1步
注意三种异常情况保证代码的鲁棒性,
1、K=0的情况,
2、链表为空的情况
3、k<N的情况 用p.next==null判断
1 public class DaoshuK { 2 public ListNode FindKthToTail(ListNode head,int k) { 3 ListNode p = head; 4 ListNode q = null; 5 if(k==0||head == null){return null;} 6 for(int i = 0;i<k-1;i++){ 7 if(p.next==null){return null;} 8 else { 9 p = p.next; 10 } 11 } 12 q = head; 13 while(p.next!=null){ 14 p = p.next; 15 q = q.next; 16 } 17 return q; 18 } 19 public static void main(String[] args) { 20 // TODO Auto-generated method stub 21 22 } 23 24 }