8 мая 2023
Тэги: Java, алгоритмы, головоломки.
Двусвязный список – это структура данных, которая состоит из узлов, каждый из которых имеет ссылки на следующий и предыдущий элементы. Одна из часто используемых операций на двусвязных списках – это инверсия списка, то есть изменение порядка элементов на обратный.
Класс Node, представляющий собой один элемент списка, выглядит следующим образом:
Он содержит само значение элемента (в данном случае целое число) и указатели на предыдущий и следующий элемент. У первого и последнего элемента один из соответствующих указателей равен null.
Теперь создадим класс двусвязного списка DoublyLinkedList. Он содержит указатель на первый элемент head и на последний tail.
В этот класс добавим ряд вспомогательных методов.
Метод printList() последовательно проходится по всем элементам, начиная с head. На каждой итерации он выводит числовое значение текущего элемента.
Метод insert() создаёт новый элемент, инициализирует его указанным значением и добавляет в конец списка. Также мы выполняем проверку, не является ли список пустым? Если он пустой, то также надо инициализировать head. Но в любом случае в конце меняем указатель tail на новый элемент.
Теперь перейдём к реализации метода reverse(). Он должен изменить порядок следования элементов в исходном списке. То есть последний должен стать первым, предпоследний – вторым и т.п.
Алгоритм инверсии двусвязного списка состоит из нескольких шагов.
Для начала, необходимо создать временную переменную current, чтобы хранить ссылку на следующий узел. Затем в цикле через другую временную переменную temp мы меняем ссылки на следующий и предыдущий узлы местами, чтобы изменить порядок элементов. После этого мы перемещаемся на следующий узел и повторяем этот процесс до тех пор, пока не дойдем до конца списка.
После выхода из цикла head становится равным tail, затем tail становится равным текущему элементу, который окажется во временной переменной.
Теперь мы можем проверить, насколько корректно инвертируется наш список. Напишем простенький код для демонстрации:
В результате в консоли увидим следующее:
То есть наш список из четырёх элементов инвертируется корректно.
P.S. Сравните этот алгоритм с Алгоритм инвертирования массива.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.