2013-03-15 125 views
1

对不起,如果这是一个非常基本的问题,我只是想学习递归。反向链表 - 递归

以下代码可以反转链接列表。

我理解直到第3行的逻辑,但是我很困惑第4行将被称为(n.next=prev),因为在执行该行之前再次调用该函数。

有人可以让我知道这种递归的流程吗?

void reverse(node n, node prev) { 
    if (n == null) { newroot = prev; return; } 
    reverse(n.next, n); 
    n.next = prev; 
    } 
+0

代码来自哪里,出于兴趣?我看不到第4行会如何运行。第2行是基本情况,它返回一些东西,所以第3行将一直阻塞,直到它返回一些东西。是否有一些线程正在进行,这并不明显? – 2013-03-15 15:36:15

+0

该代码来自http://www.careercup.com/question?id=7787672 – Learner 2013-03-15 15:37:30

+0

谢谢,但我仍然不确定。 +1的问题。 – 2013-03-15 15:40:11

回答

2

只要ñ命中null和反向功能return会原路返回从有到它的调用函数,它的第一个函数调用一路。

更新:有关更完整的说明,请参阅下面的注释。

+0

第4行运行的是什么点? – 2013-03-15 15:37:34

+0

对不起,错过了,忙于解释递归的流程。正如我已经知道的那样,因为没有返回语句,函数会在执行(反向)'reverse(n.next,n)'后执行'n.next = prev;';'将控制权释放给调用函数。 – 2013-03-15 15:51:23

+0

当我读到它时,每当第三行调用'reverse'时,它都会阻塞,直到其中一个递归调用通过一个等于'null'的'n'。最后一个函数调用不会返回任何〜大概是'null'值,我不知道这是什么语言。这退回到'reverse'的第一个实例,它仍然停留在第3行,现在进行评估,不返回任何内容,从不允许第4行执行。我认为这就是我和Learner都看到的。我不明白第4行是如何执行的? – 2013-03-15 16:01:20