【題目】
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
【分析】
對於此題。考慮單鏈表實現,單鏈表僅僅能從頭到尾遍歷,而要找到倒數第k個結點,就須要確定,正數是第幾個結點,假設結點總數為n。最後乙個結點位置為n-1,而倒數第k個結點的位置就為n-k+1。假設從頭節點開始遍歷,僅僅要遍歷到n-k+1步就能夠。這就意味著我們須要知道兩個關鍵資訊,乙個是鍊錶長度,乙個就是n-k+1。這就須要遍歷兩次。非常明顯,這不是最佳方案。比較好的方法就是一次遍歷就能夠找到,假設我們用兩個指標,當乙個指標指向n,還有乙個指標和他相距k-1個時。還有乙個指標所指向的位置就是n-k+1的位置。就是我們要找的位置,利用兩個間距為k-1的指標實現此題不失為一種有效的辦法。
【測試**】
#include
#include
#include
<
stack
>
typedef int data_type;
typedef struct node node_t;// 給struct node取個別名node_t
typedef struct node * node_ptr;//給struct node*取個別名node_ptr
typedef struct node
;//鍊錶初始化
node_t * init()
//在鍊錶後面插入結點
node_t *insert_back(node_ptr p , data_type data)
node_t * find(node_ptr p, unsigned int k)
pbehind = p;
while(pahead->node_next !=
null)
return pbehind;
}//正常列印
void print(node_ptr p)
while(p->node_next !=
null)
printf("%d ", p->
data);
printf("\n");
}void main()
這裡一定要注意一些特殊條件。假設單鏈表是空的,查詢的位置設定為0,結點總數小於k。這些都是要考慮的,否則一旦出現這樣的測試問題。整個程式都會崩潰,小漏洞是能夠使整個功虧一簣的。
【輸出】
【延伸】
這個題解題思路能夠延伸到其它須要遍歷測試的,比方說測試乙個單鏈表是不是回環。設定兩個指標。乙個指標一次一步。還有乙個一次兩步。到最後假設快的指標居然追上了慢的那個就說明,是回環。假設走得快的走到了鍊錶的末尾還是沒有追上慢的說明,不是回環;還有測試單鏈表的中間結點,設定兩個指標。乙個走一步。還有乙個走兩步。走兩步的走到末尾時,走得慢的就走到了中間節點處,由於快的指標是慢的2倍,快的走到了n-1位置。慢的位置就是(n-1)/2,這樣的乙個指標不能一次性遍歷解決這個問題的就用兩個指標。
鍊錶中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為兩個整數n和k 0 n k 1000 n代表將要輸入的鍊錶元素的個數,k代表要查詢倒數第幾個的元素。輸入的第二行包括n個數t 1 t 1000000 代表鍊錶中的元素...
鍊錶中倒數第k個結點
題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。分析 對於此題,考慮單鏈表實現,單鏈表只能從頭到尾遍歷,而要找到倒數第k個結點,就需要確定,正數是第幾個結點,假設結點總數為n,最後乙個結點位置為n 1,而倒數第k個結點的位置就為n k 1,如果從頭節點開始遍歷,只要遍歷到n k 1步就可以,這就意味...
鍊錶中倒數第k個結點
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。思路一 設定兩個指標pre和last,先讓pre移動k 1步,如果此時pre為空,則k 鍊錶長度,返回null,否則讓pre和last同時移動。步驟為 pre pre.next if pre null 若為真,進入 否則進入 last last.n...