Java 递归在这种情况下是如何工作的;“展平双链接列表”;密码?

Java 递归在这种情况下是如何工作的;“展平双链接列表”;密码?,java,recursion,Java,Recursion,问题来自leetcode#430展平多级双链接列表。 所以基本上,每个节点都有三个字段:next、prev和child。这个问题要求将给定的链表展平 public Node flatten(Node head) { flattenHelper(head); return head; } public Node flattenHelper(Node head){ if(head.next == null){ //return if reach the ta

问题来自leetcode#430展平多级双链接列表。 所以基本上,每个节点都有三个字段:next、prev和child。这个问题要求将给定的链表展平

public Node flatten(Node head) {
    flattenHelper(head);
    return head;
}

public Node flattenHelper(Node head){
    if(head.next == null){
        //return if reach the tail
        System.out.println("returned " + head.val);
        return head;
    }
    if(head.child != null){
        Node prevNext = head.next;

        //link current node's next field to its child
        head.next = head.child;
        head.child = null;
        head.next.prev = head;

        //the tail of the child linked-list
        Node children = flatten(head.next);
        children.next = prevNext;
        prevNext.prev = children;
    }
    Node x = flatten(head.next);
    System.out.println("current Node value: " + head.val + " returned from the bottom: " + x.val);
    return x;
}
我知道有更好的方法来解决这个问题,但是为什么这个代码不起作用呢

根据我对递归的理解,最底层堆栈的返回值应该通过
Node x=flatte(head.next)传递给调用方堆栈;返回x
,最终到达
节点children=flatte(head.next)以获得连接

然而,在向上堆叠的过程中,
Node x=flatte(head.next);返回x返回当前节点下一个堆栈的节点,而不是从最底层堆栈返回的节点


非常感谢你的帮助

我不知道完整的答案,但问题在于代码的这一部分
//子链表节点children=flatte(head.next)的尾部;children.next=prevenxt;prevNext.prev=儿童在leetcode中运行您的代码,而不使用此选项,您将更进一步。问题在于将子节点添加到head.nextWithin
flatthelper()
将2
flattle(head.next)
语句更改为
flatthelper(head.next)
时保存旧节点.next。您的解决方案应该有效。我不知道完整答案,但问题出在代码的这一部分
//子链表节点children=flatte(head.next)的尾部;children.next=prevenxt;prevNext.prev=儿童在leetcode中运行您的代码,而不使用此选项,您将更进一步。问题在于将子节点添加到head.nextWithin
flatthelper()
将2
flattle(head.next)
语句更改为
flatthelper(head.next)
时保存旧节点.next。你的解决方案应该有效。