首页 > 代码库 > 链表算法递归的理解

链表算法递归的理解

一:前言

  今天在博客园里面看了一篇文章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;        }    }}

 四:总结

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

链表算法递归的理解