递归 – 递归地将堆栈转换为链接列表

所以我一直致力于一项编程任务,包括采用大小约为13,000的堆栈实现并将其转换为链表.该指南基本上是通过顺序扫描链表来填充堆栈(IE尾部将是堆栈的顶部),并且您想要使用堆栈重新创建链接列表.诀窍是你必须使用递归方法.此堆栈类中的唯一方法是pop(返回并删除顶部元素)和isEmpty(告知堆栈是否为空).我有完成工作的代码,但它需要增加
java堆栈大小(否则我得到StackOverflowError),我觉得这是不允许的.

有人说,有人知道一种方法,我可以在不增加Java堆栈大小的情况下使用它.

堆栈是一个标记为S的静态字段.Head应该是链表中的第一个节点,而steper只是用于创建每个其他步骤的节点.

这是我目前的代码:

public static void stackToList()
{
    int x = 0;
        if(S.isEmpty())
        {
            return;
        }
        x = S.pop();
        stackToList();
        if (head == null)
        {
            head = new ListNode(x, null);
            steper = head;
        }
        else
        {
            steper.next = new ListNode(x, null);
            steper = steper.next;
        }

}

提前感谢您的帮助.

最佳答案 它正在发生,因为您在内存堆栈中保留了完整的函数调用列表.只有在到达堆栈底部后才开始创建链接列表,从而保持对stackList的所有先前调用等待结束.

您需要开始使用第一个堆栈创建链接列表.

一个简单的&未经测试(现在很长时间没有在Java中工作)函数可能看起来像:

public static ListNode stackToList(ListNode head) {
    if(S.isEmpty())
        return head;

    int stackValue = S.pop();
    ListNode node = ListNode(stackValue, null);
    node.next(head);
    return stackToList(node);
}

你称之为:

ListNode head = stackToList(null)

HTH

编辑:现在,我发布它,我意识到我的代码可能与你的相同,因为我记得Java doesn’t support tail-call optimization.

点赞