演算法 獲取鍊錶中倒數第k個結點

2021-08-04 16:44:14 字數 1041 閱讀 2458

題目:

輸入乙個鍊錶,輸出該鍊錶中的倒數第k個結點。比如鍊錶中的值為1,2,3,4,5,6。倒數第三個結點為值為4的結點。鍊錶定義如下:

struct listnode

;

解題思路:這個問題相對來說還是挺好理解的,要找到倒數第k個結點,最直接的思路肯定是倒著數k個結點不就好了,但是問題是鍊錶不能從尾結點開始遍歷,只能從頭結點開始。

那麼倒數第k個的問題基於必須要轉化成正數第n-k+1個,其中n是整個鍊錶的長度,那麼問題就可以這樣解決:

(1)先遍歷一遍鍊錶,得到鍊錶的長度n;

(2)再從頭遍歷鍊錶,遍歷到n-k+1個就是要找到的倒數第k個結點。

但是這種方法必須要遍歷兩次,那麼有沒有遍歷一次就得到正確結果的方法呢?

可以通過定義兩個指標,第乙個指標p1先走k-1步後第二個指標p2再開始走,到k步時兩個指標同步走,那麼當p1到底鍊錶的結尾時,p2正好走到了第k個結點。

此時這種方法犧牲了空間複雜度(兩個指標),換來了時間複雜度的降低,這也是設計演算法時比較常用的方式—「用空間換時間」。

**實現:

listnode* findkthtotail(listnode* plisthead, unsigned int k)

}pbehind = plisthead;

while(pahead->next != null)

return pbehind;

}

上述**具有較好的魯棒性:

(1)如何輸入的 *plisthead 為空,程式返回null而不會異常。

(2)如果輸入鍊錶 *plisthead長度小於k個,程式返回null而不會異常。(乙個小於k個長度的鍊錶顯然沒有倒數第k個結點)

(3)如果輸入的k=0,**不會異常,而是返回null。

獲取鍊錶中倒數第K個結點

解題思路 可以借助快慢指標的思想,定義兩個指標,把兩個指標都放在頭結點的位置,讓快指標先走k步停下來,然後接下來,讓兩個指標同時從他們的當前位置 此時,慢指標在頭結點的位置,快指標在距頭結點k步的位置 一步步向後走,當快指標走完的時候,此時,慢指標剛好指向鍊錶中倒數第k個結點。記得考慮特殊情況噢!根...

鍊錶中倒數第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步就可以,這就意味...