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、阶乘和计数步骤。谢谢,没问题!只要不断地练习一堆例题,一步一步地完成你的逻辑。