这道题的思路,第一种解法,是很容易想到的方法,我第一次就像出来了,但是,后面一种解法,我也有想到快慢指针,就是不知道怎么实现,现在清楚了,就是先核心点,

1、先让快指针走k步,之后,慢指针就跟快指针,有k步的距离,

2、如果中途还没有先走完k步距离,就到头了,就返回空指针就好了,

2、之后,再快慢指针一起走,走到结尾就返回slow指针就好了

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {

    /** 
     * 这是第一次,我在开头用list记录位置后,做的遍历,因为使用了list所有空间是O(n),时间O(n)
     **/
    public ListNode FindKthToTail1 (ListNode pHead, int k) {
        if(pHead == null || k==0) {
            return null;
        }
        ListNode curr = pHead;
        List<ListNode> list = new ArrayList<ListNode>();
        while(curr!=null) {
            list.add(curr);
            curr = curr.next;
        }
        if(list.size() < k) {
            return null;
        } else {
           return list.get(list.size()-k);
        }
    }

    /*
     *  这是用快慢指针做的,刚开始我也有想到,就是不知道怎么做
     */
    public ListNode FindKthToTail (ListNode pHead, int k) {
        ListNode slow = pHead;
        ListNode fast = pHead;
        // 快指针定位到开头第k个节点,因为i=0开始,所以具体是i-1个节点
        for(int i=0; i<k; i++) {
            if(fast != null) {
                fast = fast.next;
            } else {
                return slow = null;
            }
        }

        while(fast!=null) {
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}