遞歸反轉鏈表
先上代碼,然后一步步分析。
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)