Ответ
Интерфейс java.util.List в Java является однонаправленным (последовательным). Он предоставляет доступ к элементам по индексу и поддерживает итерацию только в прямом направлении (от начала к концу).
Однако конкретные реализации могут иметь внутреннюю двунаправленную структуру:
| Реализация | Внутренняя структура | Доступ по индексу | Итерация |
|---|---|---|---|
ArrayList |
Массив | O(1) | Только вперед (однонаправленная) |
LinkedList |
Двусвязный список (узлы с next и prev) |
O(n) | Вперед/назад (четераторы ListIterator) |
Ключевой момент: Хотя LinkedList реализован как двусвязный список, через API интерфейса List он ведет себя как однонаправленная последовательность. Для использования двунаправленных возможностей (добавление/удаление с обоих концов) необходимо использовать интерфейс Deque (который реализует LinkedList).
Пример:
List<String> list = new LinkedList<>();
list.add("A"); // Добавление в конец (однонаправленная операция)
list.get(0); // Медленно O(n), т.к. обход с начала
// Двунаправленные операции доступны через Deque
Deque<String> deque = new LinkedList<>();
deque.addFirst("Start"); // Добавление в начало
deque.addLast("End"); // Добавление в конец
String first = deque.pollFirst(); // Удаление из начала