1. 程式人生 > >單鏈表中的倒數第k個元素

單鏈表中的倒數第k個元素

1. 兩次遍歷法

為了找出倒數第k個元素,最容易想到的辦法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,
接下來遍歷一次就可以得到結果。但是該方法存在一個問題,即需要對連結串列進行兩次遍歷,第一次遍歷用於求解單鏈表的長度,
第二次遍歷用於查詢正數第n-k個元素。

2. 列舉法

如果沿從頭至尾的方向從連結串列中的某個元素開始,遍歷k個元素剛好到達連結串列尾,那麼元素就是要找的倒數第k個元素。
設計如下:依次對連結串列的每一個結點元素進行這樣的測試,遍歷k個元素,檢視是否到達連結串列尾,直到找到那個倒數第k個元素。
此種方法將對同一批元素進行反覆多次的遍歷,對於連結串列的大部分元素而言,都要遍歷k個元素,如果連結串列長度為n,
則該演算法時間複雜度為O(kn)級,效率太低。

3. 雙指標法

存在另一種更高效的方法。在查詢過程中,設定兩個指標,讓其中一個指標比另一個指標先前移k-1步,然後兩個指標同時往前移動。
迴圈直到先行的指標指為NULL時,另一個指標所指的位置就是所要找的位置
public Node findElem(Node head,int k){
        if(k<1 || head == null)
        {
            return null;
        }
        Node p1 = head;
        Node p2 = head;
        for (int i = 0; i < k - 1; i++) { //前移k-1步
            if(p1.next != null){
                p1 = p1.next;
            }else {
                return null;
            }

        }
        while (p1 != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        return p2;
    }