[演算法]找出單鏈表中的倒數第k個元素
阿新 • • 發佈:2018-12-30
找出單鏈表中的倒數第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原始碼地址