遞歸反轉鏈表(通俗詳解)


遞歸反轉鏈表

先上代碼,然后一步步分析。

1 ListNode* reverseList(ListNode* head) {
2     if(head==NULL || head->next==NULL) 
3         return head;
4     ListNode *newHead=reverseList(head->next);
5     head->next->next=head;
6     head->next=NULL;
7     return newHead;
8 }

1.我們先考慮兩個結點。

剛進入遞歸函數時(此時是第一層遞歸),走到 ListNode *newHead=reverseList(head->next)代碼處,head->next(圖中編號為2的結點)作為頭結點進入下一層遞歸循環(第二層遞歸),注意:head結點在這一層循環中(第二層遞歸)是二號結點,執行代碼,判斷遞歸條件,二號結點的下一個結點為空所以第二層遞歸函數返回,newHead等於返回的二號結點。此時函數返回到第一層遞歸中,繼續向下執行代碼。由於遞歸返回此時head結點是二號結點。

執行 head->next->next=head 代碼后,因為head->next指針是二號結點,二號結點的next指針指向了head。
然后head->next=NULL。然后鏈表反轉成功返回newHead,將尾結點作為新的頭結點。

 

 
        

2.分析多個結點情況如此,遞歸函數先遞歸進行到最后一個結點,然后逐層遞歸返回。並修改指向的指針。

 
        

 

注意:執行遞歸時候不要跳進遞歸(每層遞歸入棧不易理解),而是根據函數的定義來弄清楚函數執行后產生什么結果。reverseList(head->next) 執行完成后,整個鏈表就成了這樣:

 

然后執行 head->next->next=head 和head->next=NULLL 下面兩個代碼反轉鏈表。

參考鏈接:https://zhuanlan.zhihu.com/p/86745433?utm_source=ZHShareTargetIDMore

 

 

 

 

 

 

 
        

 

 
        

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM