逻辑对我来说似乎很正确,我不确定它在哪里破裂。 请帮忙。
static Node sol(Node head,Node prev, Node next) {
if(next.next == null)
{
head = next;
return head;
}
if(prev!=next) {
next.next = prev;
prev = next;
}
return sol(head, prev, next.next);
}
函数调用:
sol(head,head,head);
答案 0 :(得分:0)
按照您的代码立场,您将按预期在第一次迭代中跳过if (prev != next) {}
块,但是在第二次迭代中,next.next
字段会过早指向prev
节点。当使用next.next
作为参数递归时,您将处于prev
和next
节点之间的循环中,直到堆栈崩溃为止。
除此之外,您选择的函数头还使用了一个额外的参数,这不是严格必要的,它会使函数逻辑复杂化并将负担转嫁给调用者。我建议类似以下内容:
static Node sol(Node head, Node prev) {
if (head == null) {
return null;
}
else if (head.next == null) {
head.next = prev;
return head;
}
Node tail = sol(head.next, head);
head.next = prev;
return tail;
}
使用sol(head, null);
进行调用。基本情况是head为null或链中的最后一个节点。一旦找到尾巴,它将通过递归作为新的头向后传递给调用者。 head.next = prev
沿返回方向反转列表中的链接。
此代码与您的代码之间的主要区别在于递归调用的发生位置;如果您在取回磁头后在回叫堆栈的途中执行了撤消操作,则状态会更好,以避免放错next
引用。