Java 递归在这种情况下是如何工作的;“展平双链接列表”;密码?
问题来自leetcode#430展平多级双链接列表。 所以基本上,每个节点都有三个字段:next、prev和child。这个问题要求将给定的链表展平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
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.nextWithinflatthelper()
将2flattle(head.next)
语句更改为flatthelper(head.next)
时保存旧节点.next。您的解决方案应该有效。我不知道完整答案,但问题出在代码的这一部分//子链表节点children=flatte(head.next)的尾部;children.next=prevenxt;prevNext.prev=儿童代码>在leetcode中运行您的代码,而不使用此选项,您将更进一步。问题在于将子节点添加到head.nextWithinflatthelper()
将2flattle(head.next)
语句更改为flatthelper(head.next)
时保存旧节点.next。你的解决方案应该有效。