递归反转链表(通俗详解)

递归反转链表

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

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

 

 

 

 

 

 


 


 

 

 

posted @ 2020-04-15 14:44  三行代码划江湖  阅读(5586)  评论(0编辑  收藏  举报