Как использовать цикл do while для изменения кругового связанного списка в Java?

#java #list #while-loop

Вопрос:

В настоящее время я создаю довольно стандартный подход к циклическому связанному списку и хочу изменить его. Если ему дано 3 узла Фиолетовый, Счастливый и Кролик, он должен вернуть Кролика -> Счастливый ->> Фиолетовый. Прямо сейчас, по какой-то причине, он печатает Happy — > Фиолетовый ->> Фиолетовый. Я думаю, что есть проблема с логикой в моем цикле do while, так как я довольно новичок в связанных списках.

Я не включал другие свои классы для определения функций узлов, так как они довольно длинные с другим не относящимся к делу кодом, и я знаю, что проблема не в этом (прямая печать работает нормально). Любые указатели приветствуются, и если что-то еще понадобится, дайте мне знать!

 public void reverse() {
        String result = " ";
        Node current = head;
        if (current != null) {
            do {
                current = current.prev;
                result  = current   ", ";
            } while (current != head);
        } else {
            result  = "EMPTY";
        }
        System.out.println(result);
    }
 

Комментарии:

1. Ваш код выглядит для меня нормально, но исходный список, похоже, не связан по кругу, как вы ожидаете. Мне кажется, что ваша голова ссылается не на первый элемент в вашем списке, а скорее на последний ( RABBIT ). И что ваша структура PURPLE -> > HAPPY -> > RABBIT и PURPLE ссылается на себя как на родителя, в то время RABBIT как у нее нет потомка. В основном PURPLE <- PURPLE <-> <-> HAPPY <-> <-> RABBIT -> null

2. Хорошая мысль. После дальнейшего расследования я понял, что имею дело с круговым двусвязным списком, поэтому я предполагаю, что мне придется несколько изменить свой подход.

3. Я не вижу никаких проблем с вашим кодом. Проблема в том, с head чем вам следует выполнить печать перед if (current != null) отладкой. Скорее всего, это имеет значение, Rabbit .

Ответ №1:

Используйте спускаемый генератор

     LinkedList<String> list = new LinkedList<>();
    list.add("Purple");
    list.add("Happy");
    list.add("Rabbit");
    for (Iterator<String> iterator = list.descendingIterator(); iterator.hasNext(); ) {
        String next =  iterator.next();
        System.out.println("next = "   next);
    }