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