递归反转链表
先上代码,然后一步步分析。
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)