Создать реверсивный связанный список - PullRequest
1 голос
/ 28 сентября 2019

Java-код: https://i.stack.imgur.com/6pBfp.png enter image description here Я пытаюсь перевернуть Связанный список, но получаю ошибку StackOverFlow и не могу понять, почему...

Я был бы рад, если бы кто-нибудь мог помочь мне здесь

public static void reverseLinkedList(IntNode head) {
    IntNode current = head;
    IntNode next = current.getNext();

    while (next != null) {
        IntNode temp = current;
        current = next;
        next = next.getNext();
        current.setNext(temp);
    }
    System.out.println(current);
}


Exception in thread "main" java.lang.StackOverflowError
    at java.base/java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:538)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:174)
    at java.base/java.lang.StringBuilder.<init>(StringBuilder.java:125)
    at IntNode.toString(IntNode.java:31)
    at java.base/java.lang.String.valueOf(String.java:2951)
    at java.base/java.lang.StringBuilder.append(StringBuilder.java:168)
    at IntNode.toString(IntNode.java:31)
    at java.base/java.lang.String.valueOf(String.java:2951)

1 Ответ

1 голос
/ 28 сентября 2019

Сама ошибка stackoverflow отсутствует в списке reverseLinked.Это ToString, которая вызовет эту ошибку.Но это вызвано тем, что ваш обратный связанный список создает бесконечный цикл: два узла, которые указывают друг на друга.

Вы должны каждый раз иметь ссылку на три последовательных узла.Итак:

&hellip; &leftarrow; B   C &rightarrow; D &rightarrow; E &rightarrow; &hellip;
    &uparrow;   &uparrow;   &uparrow;

Мы можем каждый раз позволить C указывать на B как следующий узел:

&hellip; &leftarrow; B &leftarrow; C   D &rightarrow; E &rightarrow; &hellip;
    &uparrow;   &uparrow;   &uparrow;

, а затем переходить к следующему элементу:

&hellip; &leftarrow; B &leftarrow; C   D &rightarrow; E &rightarrow; &hellip;
        &uparrow;   &uparrow;   &uparrow;

Если третий указатель равен null, нам нужно только позволить второму указателю взять первый в качестве следующего и установить следующий из второго на null:

&hellip; &leftarrow; Y   Z &rightarrow; null
    &uparrow;   &uparrow;   &uparrow;

Таким образом, мы конвертируем это в:

&hellip; &leftarrow; Y &leftarrow; Z   null
    &uparrow;   &uparrow;   &uparrow;

Таким образом, мы можем реализовать это в алгоритме следующим образом:

public static IntNode reverseLinkedList(IntNode node0) {
    if(node0 == null) {
        return null;
    }
    IntNode node1 = node0.getNext();
    node0.setNext(null);
    if(node1 == null) {
        return node0;
    }
    Int node2 = node1.getNext();
    node1.setNext(node0);
    while(node2 != null) {
        node1.setNext(node0);
        node0 = node1;
        node1 = node2;
        node2 = node2.getNext();
    }
    node1.setNext(node0);
    return node1;
}

В результате мы возвращаем новый заголовок связанного списка.

...