算法---輸出單向鏈表中倒數第K個節點

    輸出單向鏈表中倒數第K個節點,好比咱們如今有int類型的1,2,3,4,5,6,7,8組成的一個單向鏈表,求倒數第三個元素。如圖所示:java


    咱們正常的思路就是從後往前推倒數第K個元素,這裏有這樣幾個問題。首先是單向鏈表的限制,鏈表節點只有next指針指向下一個元素,因此咱們只能從前日後推;其次咱們須要知道最後一個元素後才能從後往前倒推,這裏就只能經過next指針由前日後遍歷,這是第一次循環,而後從後往前推又要開始遍歷,這是第二次循環;另外若是從後往前推這也是個問題;或者說第一次循環時知道了單項鍊表長度,而後經過倒數第K個,咱們能推導出是正數第幾個,這樣再從前日後循環一次就能獲取這個節點,可是這樣仍是循環了兩次。node

    這裏咱們只介紹目前瞭解到的最優的解決方案,其餘方法就不一一介紹了。測試

    咱們經過兩個指針和一次循環就能獲得想要的節點,步驟以下:this

  1. 最後一個節點與倒數第K個節點之間的距離爲K-1。指定兩個指針P1和pP2,P1從頭結點開始先移動K-1步,停下來。
  2. P1停下來後,P2指向第一個節點,注意此時P1與P2之間的距離正好是最後一個節點和倒數第K個節點間的距離。
  3. P1和P2同時向後移動,當P1移動到最後一個節點的位置時停下來,此時P2的位置就正好是倒數第K個元素的位置了,那麼P2處的節點就是咱們想要的倒數第K個節點。

    咱們能夠按上圖中的鏈表來試算下。有 1,2,3,4,5,6,7,8這樣順序的一個單項鍊表,求倒數第3個節點。倒數第三個節點與最後一個節點的距離是3-1=2。先定義P1指針,從頭節點移動2步,到達節點3的位置停下來,這時定義P2節點指向頭節點,也就是節點1,而後P1和P2節點同時向後移動,當P1節點移動到最後一個節點8時,此時P1移動到了節點6處,而節點6就是倒數第3個節點,ok,節點6就是咱們要的節點。3d

    代碼實現:指針

public class SingleLinkedNode {

    //節點上存儲的數據
    private Object data;

    //該節點的下一個節點
    private SingleLinkedNode next;

    public SingleLinkedNode(Object data){
        this.data = data;
    }
   
    ......
}
public static SingleLinkedNode getReverseKPathNode(SingleLinkedNode head , int  k){
        //定義兩個指針P1和P2,這裏直接用節點表示
        SingleLinkedNode P1 = head;
        SingleLinkedNode P2 = head;
        //P1移動到K-1位置停下來
        for(int i=1;i<=k-1;i++){
            P1=P1.getNext();
        }

        //P1和P2同時向後移動,直到P1節點移動到最後一個節點
        while(P1.getNext()!=null){
            P1 = P1.getNext();
            P2 = P2.getNext();
        }
        //此時P2節點就是倒數第K個節點
        return P2;
}

    測試:code

public static void main(String[] args){
        SingleLinkedNode node1 = new SingleLinkedNode(1);
        SingleLinkedNode node2 = new SingleLinkedNode(2);
        SingleLinkedNode node3 = new SingleLinkedNode(3);
        SingleLinkedNode node4 = new SingleLinkedNode(4);
        SingleLinkedNode node5 = new SingleLinkedNode(5);
        SingleLinkedNode node6 = new SingleLinkedNode(6);
        SingleLinkedNode node7 = new SingleLinkedNode(7);
        SingleLinkedNode node8 = new SingleLinkedNode(8);
        node1.setNext(node2);
        node2.setNext(node3);
        node3.setNext(node4);
        node4.setNext(node5);
        node5.setNext(node6);
        node6.setNext(node7);
        node7.setNext(node8);
        System.out.println(getReverseKPathNode(node1,3).getData());
}

    執行結果爲:6,。正確blog

相關文章
相關標籤/搜索