求煉表中的倒數第K個節點

2022-03-29 05:37:20 字數 1502 閱讀 1829

原文:

求鍊錶的倒數第k個節點:主要思路設定兩個指標,剛開始都指向鍊錶的第乙個節點,第乙個指標先走k-1步,然後兩個一塊走,直到第乙個指標的下一位為nullptr,則第二個指標所指的位置就是倒數第k個節點。

在程式設計書上看見這個方法,自己畫了個鍊錶試了試果然是這樣,但是這是個什麼原理呢?

想了想是這樣的耶。。。

分為兩種情況:1、倒數第k個位置在正數第k個位置之後,如圖:

此種情況下:p_head和nullptr分別表示鍊錶的頭位置和末位置,+k表示正數第k個位置,-k表示倒數第k個位置,first指標代表已經走了k-1個位置之後的第乙個指標位置,second表示第二個指標從起始位置開始。

然後first和second一塊開始走,直到first->next指向nullptr,即first_end的位置,此時second走到second_end,second_end即是倒數第k個位置。first和second走過的長度都是藍色區域加黃色區域的長度。

2、倒數第k個位置在正數第k個位置之前,如圖:

此種情況下:p_head和nullptr分別表示鍊錶的頭位置和末位置,+k表示正數第k個位置,-k表示倒數第k個位置,first指標代表已經走了k-1個位置之後的第乙個指標位置,second表示第二個指標從起始位置開始。

然後first和second一塊開始走,直到first->next指向nullptr,即first_end的位置,此時second走到 second_end,second_end即是倒數第k個位置。first和second走過的長度都是黃色區域的長度。

其實還有第三種情況:就是比較特殊的-k=+k的情況,即倒數第k個位置就是正數第k個位置(中間位置),但這種情況可以歸類為以上兩種情況的任意一種,不做特殊處理。

故可以簡單的寫出**:

注意事項:1、要是k大於鍊錶長度怎麼辦?

2、k<=0怎麼辦?

1 listnode* findr_kth(listnode* p_head, unsigned int k)

2 13 while (first->next != nullptr)

14

18 return second;

19 }

最終的完善:

1 struct listnode;

5 listnode* findkthtotail(listnode *phead,unsigned int k)

6 18 p1 = p1->next;

19 }

20 while (p1->next != nullptr)

21

25 return p2;

26 }

求煉表中倒數第K個節點

求煉表中倒數第k個節點,思路很簡單我們在遍歷時維持兩個指標,第乙個指標從鍊錶的頭指標開始遍歷,在第k 1步之前,第二個指標保持不動 在第k 1步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k 1,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二個指標 走在後面的 指標正好...

求鍊錶倒數第k個節點

1.初解 public static node findkthtotail node head,uint k behind head while ahead.next null return behind 上面的 存在3處魯棒性問題 1 輸入的head為空指標。由於 會試圖訪問空指標指向的記憶體,程...

求煉表中的倒數第K個節點

題目描述 求鍊錶的倒數第k個節點 基本思路 在遍歷時維持兩個指標,第乙個指標從鍊錶的頭指標開始遍歷,在第k 1步之前,第二個指標保持不動 在第k 1步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k 1,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二個指標 走在後面的 指...