LillianEom
5/30/2018 - 7:27 AM

获取单链表倒数第k个结点

初始:两个指针都指向dummy 第一个指针faster先走k步,然后两个指针一起走,直到faster指针==null,此时lower指针指向的就是倒数第k个结点。 特殊情况:

  1. k<=0:返回null
  2. k>链表结点数:faster前进前先判断自己是否为null (lower永远在faster之后,所以不会遇到为null的情况)
  3. k==链表结点数+1:faster刚好走到null,lower一步都不能走,而由于加入了dummy结点,此时lower还指向dummy,所以不能返回lower而应该返回null。
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class ListKNode {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head == null || k<=0) {
            return null;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode faster = dummy, lower = dummy;
        for(int i=0; i<k; i++) {
            if(faster == null) {
                return null;
            } else {
                faster = faster.next;
            }
        }
        while(faster!=null) {
            faster = faster.next;
            lower = lower.next;
        }
        return (lower==dummy) ? null : lower;
    }
}