链表算法递归的理解

一:前言

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

 四:总结

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

原文地址:https://www.cnblogs.com/wuhao1991/p/4054809.html