【问题标题】:reverse linked list - Recursion反向链表 - 递归
【发布时间】:2013-03-04 09:25:35
【问题描述】:

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

下面的代码可以反转一个链表。

我理解第 3 行之前的逻辑,但我很困惑何时会调用第 4 行 (n.next=prev),因为在执行此行之前再次调用了该函数。

谁能告诉我这个递归的流程?

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

【问题讨论】:

  • 代码来自哪里,出于兴趣?我也看不到第 4 行将如何运行。第 2 行是基本情况,它返回一些东西,所以第 3 行将一直阻塞,直到它返回一些东西。是否有一些不明显的线程正在发生?
  • 谢谢,但我还是不确定。为问题 +1。
  • 我会用简单的例子来介绍代码。首先,有一个空列表。然后,使用一个包含一个元素的列表。然后,使用包含两个元素的列表。如果你明白这一点,你应该能够理解所有这些。

标签: recursion singly-linked-list


【解决方案1】:

只要 n 击中null 和反向函数return,它就会从那里回溯到它的调用函数,一直到它的第一个调用函数。

更新:请参阅下面的 cmets 以获得更完整的说明。

【讨论】:

  • 抱歉错过了,正忙着解释递归的流程。正如我已经弄清楚的那样,因为其中没有 return 语句,所以在 reverse(n.next, n); 释放控制权到调用函数之后,函数将执行(回溯时)n.next = prev;
  • 当我读到它时,每次第三行调用reverse,它都会阻塞,直到其中一个递归调用通过一个等于nulln。最后一个函数调用不会返回任何东西~大概是一个null 值,我不知道这是什么语言。这又回到了reverse 的第一个实例,它仍然停留在第 3 行,现在进行评估,没有返回任何内容,从未允许第 4 行执行。我想这就是我和学习者的看法。我看不到第 4 行是如何执行的?
  • 查看函数第一次返回时,它返回到第 3 行,然后执行第 4 行,当函数执行完自己时,控制权返回到调用函数第 3 行,然后执行第 4 行依此类推....直到最终的父函数执行。
  • 对不起。我现在明白了。我看到第 3 行的工作方式好像是 return reverse(n.next, n);。我的错。干杯。
  • @Carl Smith,递归有时很棘手,即使对于熟练的程序员也是如此!
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 2021-11-30
  • 1970-01-01
相关资源
最近更新 更多