Java 这种递归和回溯在LeetCode中是如何工作的?
此函数将反向打印链表的节点:Java 这种递归和回溯在LeetCode中是如何工作的?,java,algorithm,recursion,Java,Algorithm,Recursion,此函数将反向打印链表的节点: void recur(ListNode head) { if(head == null) return; recur(head.next); tmp.add(head.val); } 如果列表为1->2->3,则tmp(一个ArrayList)将添加节点的值 最后,我们可以通过打印tmp得到一个列表[3,2,1]。然而,我不知道为什么它会起作用。为什么函数循环重复到最后一个节点,然后按相反的顺序添加值?我认为这个流程图可能会对您有所帮助
void recur(ListNode head) {
if(head == null) return;
recur(head.next);
tmp.add(head.val);
}
如果列表为1->2->3,则tmp
(一个ArrayList
)将添加节点的值
最后,我们可以通过打印
tmp
得到一个列表[3,2,1]
。然而,我不知道为什么它会起作用。为什么函数循环重复到最后一个节点,然后按相反的顺序添加值?我认为这个流程图可能会对您有所帮助
从图中可以看出,只有在到达链表末尾时,head.value才会添加到tmp列表中。即。头BeMaseNUL/< P>这非常简单,让我们考虑两个ListNoad的<代码> [1 -> 2 ] < /Cult>节点,我们希望与您的函数反向:
void recur(ListNode head) {
if (head == null) return;
recur(head.next);
tmp.add(head.val);
}
在第一个杆上,头部将指向1
值,由于头部节点不为null,因此该检查if(头部==null)
将返回false
李>
然后,我们调用相同的函数recur
,但用于值为2
的下一个节点,然后执行recur
重新开始,但将节点2
作为头节点。我们再次检查如果(head==null)
->false
,同样的原因,head在这里不为null
然后我们调用相同的函数recur
,但下一个节点为nullhead.next->null
,因为节点2
之后不再有节点。我们检查if(head==null)
,但是现在我们有了true
,即当前节点,这意味着之后没有节点了,我们不能再继续调用recur()
。因此,我们使用return
语句停止递归
现在,我们再次返回步骤#2并继续执行,因为recur(head.next)
的执行以return
语句结束。这意味着,此节点是最后一个节点,我们将其值放入tmp
。对于ListNode2
执行的recur
结束,因为之后没有代码行
现在,我们再次返回步骤#1,并执行步骤4中描述的相同逻辑。由于节点2
的recur
结束其执行,我们继续并将值1
放入tmp
数组李>
if(head==null)返回代码>-此检查称为递归基本情况
,意思是当我们需要结束执行并退出时,,没有它,递归将无限进行
我们挖掘到ListNode的末尾,然后再次返回顶部。
为了能够将ListNode值放入tmp
中,我们需要首先将下一个值放入tmp
中,以此类推
我希望,我解释得更准确,现在对你来说也更清楚。你的逻辑太棒了!谢谢嘿,欢迎!为便于将来参考,请避免在问题中张贴代码的图像。相反,将代码直接复制到问题中(标记为代码)。谢谢知道了!谢谢,伙计!