Java 运行列表时发生堆栈溢出错误
我正在研究数据结构,我必须自己做一个双链表,创建节点和列表对象,而不是使用Java实现,如EdList,每次我试图在列表中添加2个元素时都会出现堆栈溢出错误,我不知道为什么。你能帮帮我吗Java 运行列表时发生堆栈溢出错误,java,data-structures,Java,Data Structures,我正在研究数据结构,我必须自己做一个双链表,创建节点和列表对象,而不是使用Java实现,如EdList,每次我试图在列表中添加2个元素时都会出现堆栈溢出错误,我不知道为什么。你能帮帮我吗 public class DoubleLinked { Node head; Node tail; int size; public DoubleLinked() { head = tail = null; size = 0; }
public class DoubleLinked {
Node head;
Node tail;
int size;
public DoubleLinked() {
head = tail = null;
size = 0;
}
public void insertOnHead(int x) {
Node newNode = new Node();
newNode.value = x;
if(head == null) {
head = newNode;
size++;
} else {
newNode.next = head;
head.previous = newNode;
head = newNode;
size++;
}
}
@Override
public String toString() {
return "[Head: " + head + ", Tail: " + tail + ", Size: "
+ size + "]";
}
}
public class Node {
int value;
Node next;
Node previous;
@Override
public String toString() {
return "Node [Value: " + value + ", Next: " + next + ", Previous: " + previous + "]";
}
}
它插入第一个元素(5),但不插入第二个元素(6)
主要内容:
堆栈跟踪:
Exception in thread "main" java.lang.StackOverflowError at
java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:63)
at java.lang.StringBuilder.<init>(StringBuilder.java:109)
at DoblementeEnlazadas.Nodo.toString(Nodo.java:12)
at java.lang.String.valueOf(String.java:2854)
at java.lang.StringBuilder.append(StringBuilder.java:128)
at DoblementeEnlazadas.Nodo.toString(Nodo.java:12)
线程“main”java.lang.StackOverflower中的异常位于
java.lang.AbstractStringBuilder。(AbstractStringBuilder.java:63)
位于java.lang.StringBuilder。(StringBuilder.java:109)
在doblementeellazadas.Nodo.toString(Nodo.java:12)
位于java.lang.String.valueOf(String.java:2854)
位于java.lang.StringBuilder.append(StringBuilder.java:128)
在doblementeellazadas.Nodo.toString(Nodo.java:12)
异常堆栈跟踪将对此进行确认,但问题非常明显:
public String toString() {
return "Node [Value: " + value + ", Next: " + next + ", Previous: " + previous + "]";
}
因此,当您将一个节点转换为一个字符串时,您还将转换其两个相邻节点。这会导致调用它们的
toString()
方法,从而转换它们的两个邻居,这会导致调用它们的toString()
方法,从而转换它们的两个邻居,等等。异常堆栈跟踪会确认这一点,但问题非常明显:
public String toString() {
return "Node [Value: " + value + ", Next: " + next + ", Previous: " + previous + "]";
}
因此,当您将一个节点转换为一个字符串时,您还将转换其两个相邻节点。这导致调用它们的
toString()
方法,转换它们的两个邻居,这导致调用它们的toString()
方法,转换它们的两个邻居,等等。第一步是读取和发布异常堆栈跟踪。它告诉您和我们问题在哪里。另外,提供您进行测试的代码。目前,此代码不应给出StackOverflowerError
(即使它不能按预期工作)。请不要将代码和stacktraces放在注释中。把它们放在问题中,让它们清晰易读。这是我第二次使用这个网站,对不起,谢谢你注意到我。第一步是阅读并发布异常堆栈跟踪。它告诉您和我们问题在哪里。另外,提供您进行测试的代码。目前,此代码不应给出StackOverflowerError
(即使它不能按预期工作)。请不要将代码和stacktraces放在注释中。这是我第二次使用这个网站,很抱歉,谢谢你注意到我。好的,我理解,但我用同样的方法打印了一个LinkedList,它运行得很好,那么我该如何做才能使它工作。提示:这是什么->下一步->上一步?(哎呀!Java,我忘了)这是什么。next.prev?如果你指的是单链表,那么它当然可以工作,因为单链表的节点只有一个邻居,不像双链表那样有循环引用。只需更改toString()方法,使其只打印下一个节点,而不打印上一个节点。或者更好的是,不要让它打印列表(节点)的内部,而只打印它的值:[1,24,54,32]
。我现在明白了,对你们来说,另一个简单的问题是,如果我尝试以同样的方式实现循环链接列表,我应该打印下一个节点,而不是像你们告诉我的那样打印上一个节点,对吗?不,当然不是。想想会发生什么。名单是循环的。因此,如果每个节点打印下一个节点,您将有一个无限循环,这也将导致stackoverflow错误。就像你让孩子们围成一个圈,让每个孩子说出他右边邻居的名字一样。它永远不会结束,因为它是一个圆圈。好吧,我明白,但我用同样的方法打印了一个LinkedList,它运行得非常完美,那么我该如何做才能使它工作。提示:这是什么->下一步->上一步?(哎呀!Java,我忘了)这是什么。next.prev?如果你指的是单链表,那么它当然可以工作,因为单链表的节点只有一个邻居,不像双链表那样有循环引用。只需更改toString()方法,使其只打印下一个节点,而不打印上一个节点。或者更好的是,不要让它打印列表(节点)的内部,而只打印它的值:[1,24,54,32]
。我现在明白了,对你们来说,另一个简单的问题是,如果我尝试以同样的方式实现循环链接列表,我应该打印下一个节点,而不是像你们告诉我的那样打印上一个节点,对吗?不,当然不是。想想会发生什么。名单是循环的。因此,如果每个节点打印下一个节点,您将有一个无限循环,这也将导致stackoverflow错误。就像你让孩子们围成一个圈,让每个孩子说出他右边邻居的名字一样。它永远不会结束,因为它是一个圆圈。