所以我一直致力于一项编程任务,包括采用大小约为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;
}
}
提前感谢您的帮助。
答案 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.LinkedList
和java.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
的原因是你要等到递归结束才能修改你的清单。在一些递归中,你必须等到结束,但如果你不必等待,就不要这样做。