《劍指offer》第15題 鏈表中倒數第K個結點(Java版答案)

題目:

輸入一個鏈表,輸出鏈表中倒數第K個結點。

答案:

常規思路就是要經過兩次遍歷,不夠高效。

先遍歷一遍鏈表,得到鏈表的長度n,再減去k,得到結點的正數位置,最後再遍歷得到這個結點。

 

雙指針法。只需要遍歷一次鏈表

第一個指針p1先走k步

然後第二個指針p2與p1同時走,這樣p1和p2之間一直保持k個結點的距離。

因此直到p1走到最後一個結點,此時p2正好位於倒數第k個結點。

public ListNode getLastK(ListNode head, int k) {
        if (head == null || k <= 0) {
            throw new RuntimeException("非法輸入");
        }

        ListNode p1 = head;
        ListNode p2 = head;

        //p1先走k步
        for (int i = 0; i < k; i++) {
            if (p1.next != null) {
                p1 = p1.next;
            } else {
                return null;
            }

        }

        //p1和p2同時走,直到p1走到最後結點,此時p2剛好指向倒數第k個結點
        while (p1.next != null) {
            p1 = p1.next;
            p2 = p2.next;
        }

        return p2;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章