[英]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 -> 3则tmp
(一个ArrayList
)将添加节点的值。
最后,我们可以通过打印tmp
得到一个列表[3, 2, 1]
。 但是,我不知道它为什么起作用。 为什么递归recur
循环到最后一个节点然后以相反的顺序添加值?
这非常简单,让我们考虑具有两个 ListNode 的[1 -> 2]
节点,我们想与您反转 function:
void recur(ListNode head) {
if (head == null) return;
recur(head.next);
tmp.add(head.val);
}
1
值,此检查if (head == null)
将返回false
,因为 head 节点不是 null。recur
但对于值为2
的下一个节点,并且recur
的执行重新开始,但节点2
作为头节点。 我们再次检查if (head == null)
-> false
,同样的原因,这里的 head 不是 null。recur
但对于下一个节点 null head.next -> null
,因为在节点2
之后不再有节点。 我们检查if (head == null)
,但现在我们有了true
,即当前节点,这意味着之后没有节点,我们不能 go 进一步调用recur()
。 因此,我们使用return
语句停止递归。recur(head.next)
的执行以return
语句结束。 这意味着,这个节点是最后一个,我们把它的值放到tmp
中。 并且 ListNode 2
的recur
执行结束,因为后面没有代码行。2
的recur
结束了它的执行,我们继续并将值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.