鍊錶中倒數第k個結點

2021-07-03 04:25:58 字數 1508 閱讀 6503

【題目】

輸入乙個鍊錶,輸出該鍊錶中倒數第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個結點。思路一 設定兩個指標pre和last,先讓pre移動k 1步,如果此時pre為空,則k 鍊錶長度,返回null,否則讓pre和last同時移動。步驟為 pre pre.next if pre null 若為真,進入 否則進入 last last.n...

鍊錶中倒數第K個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。k 1,2.如 鍊錶1 2 3 4 5 6.倒數第3個節點為4。include iostream using namespace std struct listnode 遍歷兩次 listnode findkthtotail0 listnode plisth...