zoukankan      html  css  js  c++  java
  • 递归反转链表(通俗详解)

    递归反转链表

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

    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

    
    
    
    
    
    
     
  • 相关阅读:
    栈和队列的概念
    01-开始使用django(全、简)
    临时记录01
    centos删除乱码名称的文件
    《计算机网络》谢希仁(第7版) 第一章
    git提交到远程虚拟机
    安全篇:弱密码python检测工具
    正向代理、Nginx(反向代理、负载均衡、静态资源服务器)
    列表去重、去除满足一定条件的元素
    editplus的常用快捷键
  • 原文地址:https://www.cnblogs.com/mld-code-life/p/12705213.html
Copyright © 2011-2022 走看看