Java 运行列表时发生堆栈溢出错误

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

我正在研究数据结构,我必须自己做一个双链表,创建节点和列表对象,而不是使用Java实现,如EdList,每次我试图在列表中添加2个元素时都会出现堆栈溢出错误,我不知道为什么。你能帮帮我吗

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错误。就像你让孩子们围成一个圈,让每个孩子说出他右边邻居的名字一样。它永远不会结束,因为它是一个圆圈。