链表算法递归的理解

一:前言

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

四:总结

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

时间: 2024-10-22 19:46:01

链表算法递归的理解的相关文章

Modified LCS (扩展欧几里德)细写了对这个算法思路的理解

题目:Modified LCS 为过此题去仔细研究了下扩展欧几里德算法,领悟了一些精华. 模板为: void gcd(ll a, ll b, ll& d, ll& x, ll& y) { if(!b) {d = a; x = 1; y = 0;} else{ gcd(b, a%b, d, y, x); y -= x*(a/b);} } 这里算出来的x,y是对于方程ax+by=gcd(a,b)而言的一组解. 为什么叫扩展欧几里德说明肯定用了欧几里德算法的原理即:gcd(a,b)=gc

单链表的递归与非递归实现

一:递归版本 1 class LinkList 2 { 3 public class LinkNode 4 { 5 public int data; 6 7 public LinkNode next; 8 } 9 10 private LinkNode head; 11 12 public void Add(int data) 13 { 14 if (head == null) 15 { 16 head = new LinkNode() { data = data }; 17 } 18 else

快速排序算法的简单理解

快速排序算法的简单理解 本文用的编程语言为python,简单阐释了作者对快速排序算法的学习心得,尽量用通俗易懂的方式向读者表达.如果文章中有什么纰漏与错误,请读者指正. 在了解快速排序之前,我们先来了解一下递归 递归 递归调用自己的函数 先来看一个函数 def (i): print(i) countdown(i-1) 这是一个不断递减的函数,如果调用这个函数,它会无限循环下去.这可不是一件好事.我们应该给予它一些限制,告诉它什么时候停止调用自己,什么时候调用自己.我们把这种限制分别叫做基线条件与

链表算法-链表前面插入节点

链表算法-链表前面插入节点

分布式理论之一:Paxos算法的通俗理解

维基的简介:Paxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的"La",此人现在在微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法. Paxos算法目前在Google的Chubby.MegaStore.Spanner等系统中得到了应用,Hadoop中的ZooKeeper也使用了Paxos算法,在上面的各个系统中,使用的算法与Lamport提出的原始Paxos并不完全一样,这个以后再慢慢分析.本博文的目的是,如何让一个小白在半

对于递归的理解

以下是我对递归的理解如果有不对希望大家指正,谢谢. 附上代码: public class Test { public static void main(String[] args) { // TODO Auto-generated method stub int sum = DiGui(5); System.out.println("mainSum="+sum); } private static int DiGui(int n) { int sum = 0; if(0 == n) {

递归的理解

//十进制的数转化为二进制    public static void toBin(int num){        if(num > 0){            toBin(num/2);            System.out.println(num%2);        }    } 以上面的十进制转化为二进制为例:传参数传入6,把6转化为二进制:使用递归函数不断的调用自身,由于方法在java中是存放到栈中的:在栈中分配空间如下图: 递归总有结束的时候,当if(0>0)的时候结束,

关于分治算法的个人理解

关于分治算法的个人理解: 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并. 以快速排序为例,先取一个参数.将大于该参数的值放在右边,小于该参数的值放在左边,使该参数处于最正确的位置上. 该案例的基本思想:是将该数组排序问题分成为该数组中的数值与选取的参数值比较大小.即简单的一对一的比较问题. 该比较问题相互独立.具有最优子结构性质,且可以合并. 1.快速排序 public class Test{ p

链表算法-后面插入节点

链表算法-后面插入节点