Forwarded from Библиотека программиста | программирование, кодинг, разработка
Летим зимовать ✈️
Когда холодает, айтишники пакуют чемоданы, а мы разыгрываем ваучер на 50 000 рублей в Островке.
Поехать к морю или остаться среди снежных пейзажей — выбирайте сами!
Чтобы участвовать, нужно оставить любую реакцию под этим постом и подписаться на каналы ниже:
😎 Типичный программист
🐸 Библиотека программиста
🟢 Ostrovok! Tech
Теперь осталось нажать на кнопку участия под этим постом и вы в игре!
Итоги подведём 12 декабря. Победителя выберем с помощью бота. Подробнее с правилами можно ознакомиться здесь.
Всем удачи!
Участников: 111
Призовых мест: 1
Дата розыгрыша: 19:00, 12.12.2025 MSK (3 дня)
Когда холодает, айтишники пакуют чемоданы, а мы разыгрываем ваучер на 50 000 рублей в Островке.
Поехать к морю или остаться среди снежных пейзажей — выбирайте сами!
Чтобы участвовать, нужно оставить любую реакцию под этим постом и подписаться на каналы ниже:
Теперь осталось нажать на кнопку участия под этим постом и вы в игре!
Итоги подведём 12 декабря. Победителя выберем с помощью бота. Подробнее с правилами можно ознакомиться здесь.
Всем удачи!
Участников: 111
Призовых мест: 1
Дата розыгрыша: 19:00, 12.12.2025 MSK (3 дня)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
LinkedList — это реализация интерфейса List и Deque на основе двусвязного списка. Отличный выбор для частых вставок/удалений, но медленный доступ по индексу.
📦 Базовая структура
LinkedList состоит из узлов (Node), связанных ссылками:
public class LinkedList<E> {
transient int size = 0;
transient Node<E> first; // голова списка
transient Node<E> last; // хвост списка
private static class Node<E> {
E item;
Node<E> next; // следующий узел
Node<E> prev; // предыдущий узел
}
}Главные особенности:
— O(1) для add/remove с концов (first/last).
— O(n) для доступа по индексу (нужен обход).
— O(1) для вставки/удаления при наличии ссылки на узел.
— Больше памяти чем ArrayList (~24 байта overhead на элемент).
Внутренности Node
→ item: элемент
→ prev: ссылка на предыдущий узел
→ next: ссылка на следующий узел
Преимущества двусвязного списка
— Обход в обе стороны (вперёд и назад).
— Быстрое удаление узла при наличии ссылки на него.
— Динамический размер без перевыделения памяти.
➕ add(E element) — добавление в конец
1. Создаётся новый Node:
newNode = new Node<>(last, element, null).2. Если список пустой
(last == null), то first = last = newNode.3. Иначе:
last.next = newNode И last = newNode.4. Увеличивается size.
Сложность: O(1).
➕ add(int index, E element) — вставка по индексу
1. Проверяется range:
index > size → IndexOutOfBoundsException.2. Если
index == size, вызывается addLast().3. Иначе находится узел по индексу через
node(index).4. Создаётся новый узел и вставляется перед найденным.
5. Обновляются ссылки prev/next соседних узлов.
Сложность: O(n) — нужен поиск узла по индексу.
🔎 get(int index) — получение по индексу
1. Проверка границ:
index >= size → IndexOutOfBoundsException.2. Вызывается
node(index) для поиска узла.3.
node(index) использует оптимизацию:— Если index < size/2: обход от first вперёд.
— Иначе: обход от last назад.
4. Возвращается item найденного узла.
Сложность: O(n) — в худшем случае обход половины списка.
➖ remove(int index) — удаление по индексу
1. Находится узел по индексу через
node(index).2. Узел отсоединяется от списка:
— node.prev.next = node.next (если prev != null).
— node.next.prev = node.prev (если next != null).
3. Обновляются first/last если нужно.
4. Обнуляются ссылки в узле для GC:
node.item = null; node.next = node.prev = null.Сложность: O(n) — поиск узла O(n), удаление O(1).
➕ addFirst(E e) / addLast(E e)
Специальные методы для работы как Deque:
list.addFirst("A"); // O(1) — добавление в начало
list.addLast("Z"); // O(1) — добавление в конецСложность: O(1) — прямое изменение first/last.
➖ removeFirst() / removeLast()
list.removeFirst(); // O(1) — удаление первого
list.removeLast(); // O(1) — удаление последнего
Сложность: O(1) — прямой доступ к first/last.
⚖️ Важные нюансы
LinkedList может работать как двусторонняя очередь. Идеально для реализации стеков и очередей.
Каждый узел требует ~24 байта overhead (на 64-bit JVM):
— 12 байт заголовок объекта
— 8 байт ссылка item
— 8 байт ссылка next
— 8 байт ссылка prev
— Padding до 8 байт
Для списка из 1000 элементов overhead ~24 КБ против ~4 КБ у ArrayList.
LinkedList НЕ реализует RandomAccess marker interface. Это сигнал для алгоритмов использовать итераторы вместо get(i).
// ❌ Медленно — O(n²)
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
}
// ✅ Быстро — O(n)
for (String s : list) {
// iterator используется автоматически
}
ListIterator позволяет двунаправленный обход и модификацию.
LinkedList допускает null значения.
→ Частые вставки/удаления с концов.
→ Модификация при итерации.
→ Неизвестный размер с частым ростом (Нет overhead на расширение массива как у ArrayList).
Ставьте 🔥, если хотите ещё разбор.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍3❤1
This media is not supported in your browser
VIEW IN TELEGRAM