Java 什么';我的反向LinkedList程序出错,导致堆栈溢出错误。
在我看来,逻辑是正确的,我真的不确定它在哪里被打破。 请帮忙Java 什么';我的反向LinkedList程序出错,导致堆栈溢出错误。,java,recursion,linked-list,Java,Recursion,Linked List,在我看来,逻辑是正确的,我真的不确定它在哪里被打破。 请帮忙 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
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);
在代码运行时,您将在第一次迭代中跳过
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
反向返回列表中的链接
这与您的代码之间的关键区别在于递归调用发生的位置;如果您在检索头部后在备份调用堆栈的过程中执行反转,您的状态会更好,以避免误放您的下一个引用。我不知道。。怎么了?你有错误吗?输出不正确?为什么您认为它不正确?是的,LinkedList.Reverse.sol(Reverse.java:41)的线程“main”java.lang.StackOverflower中出现堆栈溢出异常。它应该反转链表。这是一个循环链表吗?非常感谢您,这是最好的解释。我刚刚习惯了做迭代,我不擅长递归。我试着在递归+链接列表中工作。。。不行。再次非常感谢。你能告诉我掌握递归的最好方法吗。我只会做一些简单的问题,比如fibo、阶乘和计数步骤。谢谢,没问题!只要不断地练习一堆例题,一步一步地完成你的逻辑。