2014-09-06 3 views
0

Я изучаю структуры данных, и я должен сам создать двойной связанный список, создав объекты Node и List вместо использования реализации Java LikedList, и у меня возникла ошибка переполнения стека каждый раз, когда я пытался добавить 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).

Главная:

public class DEMain 
{ 
    public static void main(String[] args) 

    { 
     DoubleLinked l1 = new DoubleLinked(); 

     l1.insertOnHead(5); 
     l1.insertOnHead(6); 
     System.out.println(l1); 

    } 
} 

StackTrace:

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) 
+1

Первым шагом является чтение и публикация стека исключений след. Это говорит вам и нам, где проблема. –

+0

Также укажите код, в котором вы проводите тест. В настоящее время этот код не должен давать 'StackOverflowError' (даже если он не будет работать так, как ожидалось). –

+0

Не оставляйте комментарии и комментарии в коде и stacktraces. Поместите их в вопрос и сделайте их разборчивыми. –

ответ

5

стек исключение след подтвердит это, но проблема вполне очевидна:

public String toString() { 
    return "Node [Value: " + value + ", Next: " + next + ", Previous: " + previous + "]"; 
} 

Таким образом, при преобразовании узел к строке, вы также преобразуете его обоих соседей. Это вызывает их метод toString(), который преобразует их 2 соседей, что вызывает их метод toString(), который преобразует их 2 соседних и т. Д. И т. Д.

+0

Хорошо, я понимаю, но я использовал то же самое, чтобы напечатать LinkedList, и он отлично работает, как я могу это сделать, чтобы заставить его работать. –

+0

Подсказка: что это -> next-> prev? (Упс! Java, я забыл) Что это такое.next.prev? –

+0

+1: И стоп-система действительно подтверждает это. –

Смежные вопросы