單鏈表中的倒數第k個元素
阿新 • • 發佈:2018-12-13
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; }