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

2021-07-11 17:55:13 字數 1229 閱讀 1135

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

(1)方法1:首先遍歷一遍單鏈表,求出整個單鏈表的長度n,然後將倒數第k個,轉換為正數第n-k個,接下去遍歷一次就可以得到結果。但該演算法需要對鍊錶進行兩次遍歷,第一次遍歷用於求解單鏈表的長度,第二次遍歷用於查詢正數第n-k個元素。

(2)方法2:如果沿著從頭到尾的方向,從鍊錶中的某個元素開始,遍歷k個元素後剛好達到鍊錶尾,那麼該元素就是要找的倒數第k個元素。根據這一性質,可以設計如下演算法:從頭節點開始,一次對鍊錶的每乙個節點元素進行這樣的測試,遍歷k個元素,檢視是否到達鍊錶尾,直到找到那個倒數第k個元素為止。這種方法將對同一批元素進行反覆多次的遍歷,對於鍊錶中的大部分元素而言,都要遍歷k個元素,如果鍊錶的長度為n,該演算法的時間複雜度為o(kn)級,效率太低。

(3)方法3:有一種更高效的方式,只需要一次遍歷即可查詢到倒數第k個元素。由於單鏈表只能從頭到尾依次訪問鍊錶的各個節點,所以如果要找鍊錶的倒數第k個元素,也只能從頭到尾進行遍歷查詢。在查詢過程中,設定兩個指標,讓其中乙個指標比另乙個指標先前移k-1步,然後兩個指標同時往前移動。迴圈直到先行的指標指為null時,另乙個指標所指的位置就是所要找的位置。如下所示:

#include 

#include

typedef struct node

node;

// 尾插法建立單鏈表(帶頭節點)

node *createend(int arr, int len)

end->next = null; // 單鏈表建立完畢,將終端節點的指標域置空

return head;

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

node *search_last_k(node *head, int k)

while (p2 != null)

return p1;

}// 單鏈表列印

void print(node *head)

}int main(void)

; int len = sizeof(arr)/sizeof(int);

node *head = createend(arr, len);

print(head);

printf("-----------\n");

node *temp_k = search_last_k(head, 3);

printf("%d\n",temp_k->data);

return

0;}

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

一 思路 有兩個指標分別向linklist,它們分別是 low,height 先是height先向前移動k個位置,然後low和height一起向前移動,一直到height到達鍊錶的末尾,這是low所指的位置就是倒是第k個元素,考慮到的邊界值有k 1或者k linklist的長度的時候或者linkli...

python實現 找出單鏈表中的倒數第K個元素

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

如何尋找單鏈表倒數第K個元素

如下是乙個帶頭結點的單鏈表結構 typedef struct node node typedef struct linklist linklist 假設單鏈表中有n個元素,尋找倒數第k個元素,也就是尋找單鏈表中正數的第n k個元素,但是這個n是未知的。首先我們定義乙個結點的結構體指標 p讓其指向頭結...