我的反向LinkedList程序出了什么问题,给出了堆栈溢出错误。

时间:2018-12-16 23:25:44

标签: 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 sol(head, prev, next.next);

}

函数调用:

sol(head,head,head);

1 个答案:

答案 0 :(得分:0)

按照您的代码立场,您将按预期在第一次迭代中跳过if (prev != next) {}块,但是在第二次迭代中,next.next字段会过早指向prev节点。当使用next.next作为参数递归时,您将处于prevnext节点之间的循环中,直到堆栈崩溃为止。

除此之外,您选择的函数头还使用了一个额外的参数,这不是严格必要的,它会使函数逻辑复杂化并将负担转嫁给调用者。我建议类似以下内容:

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;
}

Try it!

使用sol(head, null);进行调用。基本情况是head为null或链中的最后一个节点。一旦找到尾巴,它将通过递归作为新的头向后传递给调用者。 head.next = prev沿返回方向反转列表中的链接。

此代码与您的代码之间的主要区别在于递归调用的发生位置;如果您在取回磁头后在回叫堆栈的途中执行了撤消操作,则状态会更好,以避免放错next引用。