1. 程式人生 > >【劍指Offer】14、鏈表中倒數第k個結點

【劍指Offer】14、鏈表中倒數第k個結點

find null java 計數 slow http 解法 public 輸出

??題目描述:

??輸入一個鏈表,輸出該鏈表中倒數第k個結點。為了符合習慣,從1開始計數,即鏈表的尾結點是倒數第1個節點。例如,一個鏈表有6個結點,從頭結點開始,它們的值依次是1,2,3,4,5,6。則這個鏈表倒數第三個結點是值為4的結點。

??解題思路:

??對於單鏈表來說,沒有從後向前的指針,因此一個直觀的解法是先進行一次遍歷,統計出鏈表中結點的個數n,第二次再進行一次遍歷,找到第n-k+1個結點就是我們要找的結點,但是這需要對鏈表進行兩次遍歷。

??為了實現一次遍歷,我們這裏采用雙指針解法。我們可以定義兩個指針,第一個指針從鏈表的頭指針開始先向前走k步,第二個指針保持不動,從第k+1步開始,第二個指針也從頭開始前進,兩個指針都每次前進一步。這樣,兩個指針的距離都一直保持在k,當快指針(走在前面的)到達null時,慢指針(走在後面的)正好到達第k個結點。註意:要時刻留意空指針的判斷。

??舉例:

技術分享圖片

??編程實現(Java):

    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null)
            return null;
        //思路:快慢指針,快指針先走k步,慢指針從頭開始,都向前進,快指針到null時,前一個正好是倒數第k個
        ListNode fast=head,slow=head;
        for(int i=0;i<k;i++){ //快指針先走k步
            if(fast!=null)
                fast=fast.next;
            else
                return null;
        }
        while(fast!=null){ 
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }

【劍指Offer】14、鏈表中倒數第k個結點