雙指標法 鍊錶中倒數第k個結點

2021-08-27 07:57:32 字數 876 閱讀 5709

這部分開始,書上講的是關於程式設計時魯棒性(robust)的問題,提高robust的有效途徑就是進行防禦性程式設計,在程式設計時就把所有可能出現的操作和誤操作都考慮進去,做合適的處理。

面試題22:鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第1個結點。例如乙個鍊錶有6個結點,從頭結點開始它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個結點是值為4的結點。

這題就是經典的雙指標法,乙個指標先走k-1步,然後兩個指標一起往前走,當第乙個指標走到最後乙個結點時,前乙個指標就在倒數第k個結點上了。

書上針對這個問題,進行防禦性程式設計,事先找到了一些可能引起問題的特殊輸入:

在程式中要把這些都考慮進去。

#include

#include

"../utilities/list.h"

using

namespace std;

//輸入煉表頭指標,k值,返回倒數第k個結點的位址

listnode*

findkthtotail

(listnode* plisthead,

unsigned

int k)

pbehind = plisthead;

//至此,先行指標已經"先行"完了,後行指標要踩上第乙個結點

while

(pahead-

>m_pnext !=

nullptr

)//最終,後行指標所指即為所求

return pbehind;

}int

main()

鍊錶的倒數第K個結點 雙指標

找到單鏈表中倒數第k個結點。解題思路是雙指標,第乙個指標從頭向尾部一定k 1位,然後這時候第二個指標再從頭部開始移動,當第乙個指標移動到尾部的時候,第二個指標指的位置就是倒數第k個。這裡需要考慮一些特殊情況,比如頭結點為空 k 0 k 鍊錶中的結點數。還需要注意一點的就是倒數第k個,k是從1開始的。...

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