天天看點

python 單向連結清單查找倒數第n個元素_如何找出單連結清單中的倒數第k個元素

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

2、顯然,這種方法還可以進行優化。于是想到了第二種方法,如果從頭至尾的方向從連結清單中的某個元素開始,周遊k個元素後剛好達到連結清單尾,那麼該元素就是要找到的倒數第k個元素,根據這一性質,可以設計如下算法:從頭節點開始,依次對連結清單的每一個節點元素進行這樣的測試,周遊k個元素,檢視是否到達連結清單尾,隻到找到哪個倒數第k個元素。此種方法将對同一批元素進行反複多次的周遊,對于連結清單中的大部分元素而言,都要周遊K個元素,如果連結清單長度為n個的話,該算法的時間複雜度為O(kn)級,效率太低。

3、存在另外一個更高效的方式,隻需要一次周遊即可查找到倒數第k個元素。由于單連結清單隻能從頭到尾依次通路連結清單的各個節點,是以,如果要找到連結清單的倒數第k個元素的話,也隻能從頭到尾進行周遊查找,在查找過程中,設定兩個指針,讓其中一個指針比另一個指針先前移k-1步,然後兩個指針同時往前移動。循環直到線性的指針值為NULL時,另一個指針所指向的位置就是所要找到的位置。代碼如下:

class Node{

Node next=null;

int data;

public Node(int data){

this.data=data;

}

}

public class MyLinkedList {

Node head=null;//連結清單頭的引用

public Node findElem(Node head,int k){

if(k<1||k>this.length()){

return null;

}

Node p1=head;

Node p2=head;

for(int i=0;i

參考連結:https://blog.csdn.net/jsqfengbao/article/details/44875779