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
    ,但下一个节点为null
    head.next->null
    ,因为节点
    2
    之后不再有节点。我们检查
    if(head==null)
    ,但是现在我们有了
    true
    ,即当前节点,这意味着之后没有节点了,我们不能再继续调用
    recur()
    。因此,我们使用
    return
    语句停止递归
  • 现在,我们再次返回步骤#2并继续执行,因为
    recur(head.next)
    的执行以
    return
    语句结束。这意味着,此节点是最后一个节点,我们将其值放入
    tmp
    。对于ListNode
    2
    执行的
    recur
    结束,因为之后没有代码行
  • 现在,我们再次返回步骤#1,并执行步骤4中描述的相同逻辑。由于节点
    2
    recur
    结束其执行,我们继续并将值
    1
    放入
    tmp
    数组
    if(head==null)返回-此检查称为递归
    基本情况
    ,意思是当我们需要结束执行并退出时,
    ,没有它,递归将无限进行

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


    我希望,我解释得更准确,现在对你来说也更清楚。

    你的逻辑太棒了!谢谢嘿,欢迎!为便于将来参考,请避免在问题中张贴代码的图像。相反,将代码直接复制到问题中(标记为代码)。谢谢知道了!谢谢,伙计!