Связный список
Узлы и указатели next: вставка и удаление O(1), но поиск — всегда последовательный O(n).
1class ListNode {2 value: number3 next: ListNode | null = null4 constructor(value: number) { this.value = value }5}6 7function insertHead(head: ListNode | null, value: number): ListNode {8 const node = new ListNode(value)9 node.next = head10 return node11}12 13function search(head: ListNode | null, value: number): ListNode | null {14 let cur = head15 while (cur !== null) {16 if (cur.value === value) return cur17 cur = cur.next18 }19 return null20}21 22function remove(head: ListNode | null, value: number): ListNode | null {23 if (head === null) return null24 if (head.value === value) return head.next25 let cur = head26 while (cur.next !== null && cur.next.value !== value) cur = cur.next27 if (cur.next !== null) cur.next = cur.next.next28 return head29}Проблема
Часто вставлять и удалять в середине без сдвигов: массиву нужна перекачка хвоста, списку — перестройка одной стрелки. Плата — доступ только по цепочке.
Что вы видите
Узлы в ряд, стрелки next. Вставка в голову: новая стрелка — и голова переназначена, никто не сдвинулся. Поиск — палец cur идёт по стрелкам. Удаление — prev.next перемахивает через узел.
Как это работает
Список платит последовательным доступом: нет индексации, кэш-недружелюбен. Зато вставка/удаление узла после найденного — O(1). Двусвязный добавляет prev (deque, LRU); фиктивный head упрощает крайние случаи.
Пошаговый разбор
- 01
Вставка
node.next = head; head = node — O(1).
- 02
Поиск
cur идёт по next до значения.
- 03
Удаление
prev.next = prev.next.next — узел выпал.
- 04
Цена
Поиск O(n): стрелки надо пройти ногами.
Complexity и ограничения
Вставка/удаление O(1) после поиска; поиск O(n). Память — указатели на каждый узел.
Edge cases
- Пустой список
head = null — все операции аккуратны с null.
- Удаление головы
head сдвигается — особый случай.
- Цикл
Испорченный next превращает список в кольцо.
Где встречается в реальности
LRU-кэш
Двусвязный список + хеш-таблица — классическая пара.
Очереди/стеки
Связные списки — естественная основа.
Музыкальные плейлисты
Переставить трек — перецепить пару стрелок.
«Вставка за O(1): одна стрелка вместо сдвига массива»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.