繁体   English   中英

这种递归和回溯在 LeetCode 中是如何工作的?

[英]How does this recursion and back tracking work in LeetCode?

这个 function 将反向打印链表的节点:

void recur(ListNode head) {
    if(head == null) return; 
    recur(head.next);
    tmp.add(head.val);
}

如果列表是1 -> 2 -> 3tmp (一个ArrayList )将添加节点的值。

最后,我们可以通过打印tmp得到一个列表[3, 2, 1] 但是,我不知道它为什么起作用。 为什么递归recur循环到最后一个节点然后以相反的顺序添加值?

我认为这个流程图可以帮助你。

在此处输入图像描述

从图中可以看出,仅当到达链表的末尾时,head.value 才会添加到 tmp 列表中。 即头部变成null

这非常简单,让我们考虑具有两个 ListNode 的[1 -> 2]节点,我们想与您反转 function:

void recur(ListNode head) {
    if (head == null) return;
    recur(head.next);
    tmp.add(head.val);
}
  1. 在第一个词干上,head 将指向1值,此检查if (head == null)将返回false ,因为 head 节点不是 null。
  2. 然后我们调用相同的 function recur但对于值为2的下一个节点,并且recur的执行重新开始,但节点2作为头节点。 我们再次检查if (head == null) -> false ,同样的原因,这里的 head 不是 null。
  3. 然后我们调用相同的 function recur但对于下一个节点 null head.next -> null ,因为在节点2之后不再有节点。 我们检查if (head == null) ,但现在我们有了true ,即当前节点,这意味着之后没有节点,我们不能 go 进一步调用recur() 因此,我们使用return语句停止递归。
  4. 现在,我们再次返回到第 2 步并继续执行,因为recur(head.next)的执行以return语句结束。 这意味着,这个节点是最后一个,我们把它的值放到tmp中。 并且 ListNode 2recur执行结束,因为后面没有代码行。
  5. 现在,我们再次返回到第 1 步并执行与第 4 步中描述的相同的逻辑。由于节点2recur结束了它的执行,我们继续并将值1放入tmp数组。

if (head == null) return; - 这个检查,称为递归base case ,意味着when we need to end execution and exit? ,没有它递归将无限次 go。

我们挖掘到 ListNode 的末尾,然后再次返回顶部。 为了能够将 ListNode 值放入tmp ,我们首先需要将下一个值放入tmp ,依此类推。

我希望,我现在解释得更准确,更清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM