1. 程式人生 > >[演算法]找出單鏈表中的倒數第k個元素

[演算法]找出單鏈表中的倒數第k個元素

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

解題思路:

為了求出連結串列中的倒數第k個元素,最容易想到的方法是首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下去遍歷一次就可以得到結果。不過這種方法需要對連結串列進行兩次遍歷,第一次遍歷用於求解單鏈表的長度,第二次遍歷用於查詢正數第n-k個元素。
如果沿從頭至尾的方向從連結串列中的某個元素開始,遍歷k個元素剛好到達連結串列尾,那麼元素就是要找的倒數第k個元素。設計如下:依次對連結串列的每一個結點元素進行這樣的測試,遍歷k個元素,檢視是否到達連結串列尾,直到找到那個倒數第k個元素。此種方法將對同一批元素進行反覆多次的遍歷,對於連結串列的大部分元素而言,都要遍歷k個元素,如果連結串列長度為n,則該演算法時間複雜度為O(kn)級,效率太低。
存在另一種更高效的方法。在查詢過程中,設定兩個指標,讓其中一個指標比另一個指標先前移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; }

Github原始碼地址