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


  題目描述:

  輸入一個鏈表,輸出該鏈表中倒數第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;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM