Java代码的两种思路
思路1:先遍历链表,看看链表的长度length是多,如果长度小于k,则直接返回null,如果等于k,直接返回pHead,如果大于k,则移动length-k步即可。

public ListNode FindKthToTail (ListNode pHead, int k) {
        // write code here
        //思路1:可以先遍历一遍链表看看链表的长度length,然后在遍历一下,返回倒数length-k个元素
        if(pHead == null) return null;
        ListNode p = pHead;
        int length = 0;//记录链表的长度
        while(p!=null){
            length++;
            p = p.next;
        }
        if(length<k) return null;//不存在倒数第k个结点
        if(length == k) return pHead;
        if(length>k){
            int count = length - k;
            ListNode np = pHead;
            while(count>0){
                np = np.next;
                count--;
            }
            return np;
        }
        return null;
    }

思路2:直接使用两个指针,第一个指针先走k步,如果没有结束,则第二个指针和第一个指针同时移动,当第一个指针移动到链表结尾时,此时的第二个指针就是倒数第k个元素,因为第一个指针比第二个指针多走了k步,而此时第一个指针在末尾,自然第二个指针所指的就是倒数第k个!

public ListNode FindKthToTail (ListNode pHead, int k) {
        // write code here
        ListNode first = pHead;
        for(int  i= 0;i<k;i++){
             //如果提前结束,说明链表的长度小于k
            if(first == null) return first;
            first = first.next;
        }
        ListNode second = pHead;//第二个指针
        while(first!=null){
            first = first.next;
            second = second.next;
        }
        return second;
    }
}