如何找出單鏈表中的倒數第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讓其指向頭結...