zoukankan      html  css  js  c++  java
  • 链表算法递归的理解

    一:前言

      今天在博客园里面看了一篇文章http://www.cnblogs.com/huangxincheng/p/4051854.html(单链表的倒置),其实自己看了一个小时最后那点还是没看明白,自己的不明白在于,递归调用到最后执行递归下面的代码是怎么执行的,如果执行了,执行时的数据从哪来的?我就是这点想不明白,但是我自己能看懂这个代码。此时的想不明白不知道算不算钻牛角尖。还是先说说自己的理解吧!!!

    二:我把他的那段代码复制过来了,单链表我自己又随便写个是:9---->6------->8------>2

              public LinkNode Reverse(LinkNode node)
              {
                  if (node.next == null)
                      return node;
    
     //这里循环到3的时候也就是说node.next=2的时候,在调用Reverse(*)方法的时候最后返回的结果就是‘2’了,回执行递归方法下面的
    //三段代码,此时的数据时怎么来的我不是很清楚啊下面细说
    
                  var prevNode = Reverse(node.next);
       
                  var temp = node.next;
     
                  temp.next = node;
     
                  node.next = null;
     
                 return prevNode;
            }                

    在返回‘2’后,那么var preNode=2,再执行var temp =node.next,此时node=2,2的next是空,空的下一个再指向node,再把node的下一个置为空,再继续道node=8,8的下一个本来是‘2’的,也就是说此时temp等于‘2’,temp.next=node此时就把‘2’的下一个指向了‘8’,再把‘8’的下一个置为空。以此类推,还是觉得这里的一段代码好巧啊!!!希望自己的理解是正确的啊。

    三:自己做了个小测试,有助于理解

    package link;
    
    public class LinkDemo {
        public static void main(String args[]){
            printf(0);
        }
        public static int printf(int i){
            if(i==10){
                return i;
            }else{
                i=i+1;
                //System.out.println("i的值"+i);
                printf(i);//如果这里写成这样printf(i++)的话,每次传过去的值是i,但是没有加1,一直执行下去,然后包个错,可以试验下,但是如果搞成++i的话又可以了
                System.out.println("第"+i+"次---->"+i);
                return i;
            }
        }
    }

     四:总结

      以前自己看算法的时候老是觉得不好懂,今天自己试验了下,才知道需要自己在实践中去理解,比自己只看书强多了啊。以后还是得多学学算法,太巧妙了啊。希望这几天能把知识总结下,好多啊,都没时间去整理,自己还想去对一些源码进行研究了。只能尽量挤下时间了!!!

  • 相关阅读:
    表单序列化
    创建.ignore文件
    头条数学救火队长马丁的一道中山大学研究生入学考试数学分析题
    实数理论
    方法
    目标
    闭区间有限覆盖定理
    零值定理的确界原理证明方法,来自百度
    各种范例
    零值定理
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/4054809.html
Copyright © 2011-2022 走看看