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

时间:2016-09-30 13:01:44

标签: recursion

所以我一直致力于一项编程任务,包括采用大小约为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;
        }

}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为您在内存堆栈中保留了完整的函数调用列表。只有在到达堆栈底部后才开始创建链接列表,从而保持之前对DISQUS is not defined的所有呼叫都等待结束。

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

一个简单的& 未经过测试(现在很长时间没有在Java中工作)功能可能如下所示:

stackList

你称之为:

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

HTH

编辑:现在我发布了它,我意识到我的代码可能与您的代码有相同的问题,因为我记得Java doesn't support tail-call optimization

答案 1 :(得分:0)

如果您使用的是java.util.LinkedListjava.util.Stack,那么您的问题并不完全清楚,但由于您没有提供这些对象的代码,我将在下面的示例解决方案中使用这些代码:< / p>

public static void main(String[] args) {
    //Create a stack
    Stack<Integer> stack = new Stack<Integer>();
    stack.push(0);
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.push(4);
    stack.push(5);
    stack.push(6);
    stack.push(7);
    stack.push(8);
    stack.push(9);

    //Create a list to hold your stack elements
    LinkedList<Integer> linkedList = new LinkedList<Integer>();

    //Call the conversion method, which modifies both the stack and the list
    convertStackToLinkedList(stack, linkedList);

    //print the results
    System.out.println("linkedList: "+linkedList);
}

public static void convertStackToLinkedList(Stack<Integer> stack, LinkedList<Integer> linkedList){
    int topStackElement = stack.pop();
    linkedList.add(0,topStackElement);
    if(!stack.isEmpty())
        convertStackToLinkedList(stack, linkedList);
}

我怀疑您可能没有使用java.util.LinkedList,因为您的代码正在尝试修改列表的内部。因此,您只需要在java.util.LinkedList类中实现类似于add(int index, E element)方法的方法,然后在递归中使用它。如果您可以访问列表的内部,我假设您可以这样做。

修改

我忘了提及我同意Harsh Gupta的答案,因为你看到StackOverflowError的原因是你要等到递归结束才能修改你的清单。在一些递归中,你必须等到结束,但如果你不必等待,就不要这样做。