为什么这个JAVA代码(DoublyLinkedList)是错误的,堆栈溢出
我不知道为什么是堆栈溢出 错误消息是这样的为什么这个JAVA代码(DoublyLinkedList)是错误的,堆栈溢出,java,doubly-linked-list,Java,Doubly Linked List,我不知道为什么是堆栈溢出 错误消息是这样的 Exception in thread "main" java.lang.StackOverflowError at java.lang.AbstractStringBuilder.append(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at java.lang.StringBuilder.<init>(Unknown Sour
Exception in thread "main" java.lang.StackOverflowError
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
at java.lang.StringBuilder.<init>(Unknown Source)
at linkedList.Node.toString(DoublyLinkedList.java:15)
at java.lang.String.valueOf(Unknown Source)
at java.lang.StringBuilder.append(Unknown Source)
线程“main”java.lang.StackOverflower中出现异常
位于java.lang.AbstractStringBuilder.append(未知源)
位于java.lang.StringBuilder.append(未知源)
位于java.lang.StringBuilder。(未知源)
在linkedList.Node.toString(DoublyLinkedList.java:15)
位于java.lang.String.valueOf(未知源)
位于java.lang.StringBuilder.append(未知源)
然后一遍又一遍地重复同样的信息
这是我第一次得到这个错误,所以请让我知道为什么会发生这个错误
这是用来制作双链表的
当我评论时//tail.next=newOne;或//newOne.prev=尾部
它起作用了
多谢各位
class Node{
String val;
Node next;
Node prev;
public Node(String val){
this.val = val;
this.next = null;
this.prev = null;
}
@Override
public String toString() {
return "Node [val=" + val + ", next=" + next + ", prev=" + prev + "]";
}
}
public class DoublyLinkedList {
Node head;
Node tail;
int length;
LinkedList<Integer> aa = new LinkedList<>();
public DoublyLinkedList() {
this.head = null;
this.tail = null;
this.length = 0;
}
public static void main(String[] args) {
DoublyLinkedList dd = new DoublyLinkedList();
dd.push("asdad");
dd.push("wwwwwww");
System.out.println(dd.toString());
}
public void push(String val) {
Node newOne = new Node(val);
if(length == 0) {
head = newOne;
tail = newOne;
} else {
tail.next = newOne;
newOne.prev = tail;
tail = newOne;
}
length++;
}
@Override
public String toString() {
return "DoublyLinkedList [head=" + head + ", tail=" + tail + ", length=" + length + "]";
}
}
类节点{
字符串val;
节点下一步;
节点前置;
公共节点(字符串val){
this.val=val;
this.next=null;
this.prev=null;
}
@凌驾
公共字符串toString(){
return“Node[val=“+val+”,next=“+next+”,prev=“+prev+””;
}
}
公共类双链接列表{
节点头;
节尾;
整数长度;
LinkedList aa=新建LinkedList();
公共双链接列表(){
this.head=null;
this.tail=null;
这个长度=0;
}
公共静态void main(字符串[]args){
DoublyLinkedList dd=新的DoublyLinkedList();
dd.push(“asdad”);
dd.push(“WWWWW”);
System.out.println(dd.toString());
}
公共无效推送(字符串val){
Node newOne=新节点(val);
如果(长度==0){
头=新的;
尾巴=新的;
}否则{
tail.next=newOne;
newOne.prev=尾部;
尾巴=新的;
}
长度++;
}
@凌驾
公共字符串toString(){
返回“双链接列表[head=“+head+”,tail=“+tail+”,length=“+length+”];
}
}
我认为您遗漏了一些代码。在您的节点中,有一个节点,在该节点中,有一个节点,在该节点中,有一个节点,…当您在toString()
返回的字符串中包含next
时,它实际上意味着next.toString()
。同样适用于prev.toString()
。因此,当调用node.toString()
时,它调用next.toString()
akanode.next.toString()
,并调用prev.toString()
akanode.next.prev.toString()
,调用next.toString()
akanode.next.prev.toString()
,调用prev.toString())
akanode.next.prev.next.prev.toString()
,其中…,堆栈溢出!!!--您确实不希望node.toString()
打印列表中的所有其他节点,因此从toString()
实现中删除next
和prev
,可能只打印下一个/上一个节点(如果存在)的值,尽管这只对调试有帮助,正常的显示/输出会有点奇怪的信息哦!现在我知道是什么原因导致堆栈溢出了!真的谢谢你们!