一:前言
今天在博客园里面看了一篇文章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; } } }
四:总结
以前自己看算法的时候老是觉得不好懂,今天自己试验了下,才知道需要自己在实践中去理解,比自己只看书强多了啊。以后还是得多学学算法,太巧妙了啊。希望这几天能把知识总结下,好多啊,都没时间去整理,自己还想去对一些源码进行研究了。只能尽量挤下时间了!!!