劍指 22 鍊錶中倒數第k個節點

2021-10-10 18:59:17 字數 1366 閱讀 3474

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

示例:

給定乙個鍊錶:1-

>2-

>3-

>4-

>

5, 和 k =

2.返回鍊錶 4

->

5.

鍊錶倒序、雙指標、函式入口與操作檢查

第一眼的想法就是遍歷鍊錶到尾節點,然後再往回找k步。因為是單鏈表,沒有反向指標,自然就聯想到使用額外空間來幫助反轉列表順序。關於使用棧來逆序鍊錶,在之前的文章中也提到過【劍指 06 從尾到頭列印鍊錶】。主要思想就是在遍歷鍊錶的時候,將每乙個鍊錶節點的指標存入棧中,因為棧是先進後出,棧頂始終儲存著最新存入的節點。全部儲存完畢後,再從棧頂依次彈出節點。

class

solution_01

if(count < k)

//判斷倒數k是否大於鍊錶全部節點數

listnode *top = head;

//k=0

while

(k)//依次彈出棧頂節點

return top;}}

;

這裡要特別注意對於**魯棒性的檢查,我一開始只檢查了函式的輸入引數是否有效(頭結點不為空指標+倒數k必須非負),但是還有一點很重要的給漏過去了,就是倒數k是否≤所有的鍊錶節點數,也就下面這個判斷語句:

if

(count < k)

這裡沒有判斷的話,比如鍊錶節點總數5個,但是k=10,程式就會崩潰。

我的第一遍解法不但需要額外的儲存空間,並且在遍歷鍊錶以便以後還要順序查詢,效率不太高。下面是劍指上的解法,只需要遍歷一次鍊錶。使用雙指標法,指標aheadbehind都指向頭結點,ahead先移動k-1步(這裡同樣要判斷k是否≤總結點數),然後aheadbehind共同移動+1,這樣當ahead指向尾節點時,behind指向的就是倒數第k個節點。

class

solution

behind = head;

while

(ahead-

>next !=

nullptr

)return behind;}}

;

劍指22 鍊錶中倒數第k個節點

題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點。分析 不得不說劍指的easy題真的思路很好想。遇到鍊錶題目一...

劍指offer 22 鍊錶中倒數第k個節點

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

劍指 Offer 22 鍊錶中倒數第k個節點

劍指 offer 22.鍊錶中倒數第k個節點 難度 簡單 輸入乙個鍊錶,輸出該鍊錶中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾節點是倒數第1個節點。例如,乙個鍊錶有6個節點,從頭節點開始,它們的值依次是1 2 3 4 5 6。這個鍊錶的倒數第3個節點是值為4的節點。示例 給...