原文:
求鍊錶的倒數第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,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二個指標 走在後面的 指...