輸入乙個鍊錶,輸出該鍊錶中倒數第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,程式就會崩潰。
我的第一遍解法不但需要額外的儲存空間,並且在遍歷鍊錶以便以後還要順序查詢,效率不太高。下面是劍指上的解法,只需要遍歷一次鍊錶。使用雙指標法
,指標ahead
和behind
都指向頭結點,ahead
先移動k-1步(這裡同樣要判斷k是否≤總結點數),然後ahead
與behind
共同移動+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的節點。示例 給...