剑指offer:链表中倒数第K个结点

题目描述:

输入一个链表,输出该链表中倒数第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 }
原文地址:https://www.cnblogs.com/zlz099/p/8572414.html