DEV//UNIT
← Алгоритмыdata-structures

Связный список

Узлы и указатели next: вставка и удаление O(1), но поиск — всегда последовательный O(n).

время O(1) вставка, O(n) поискпамять O(n)уровень: начальный
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1class ListNode {
2 value: number
3 next: ListNode | null = null
4 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 = head
10 return node
11}
12
13function search(head: ListNode | null, value: number): ListNode | null {
14 let cur = head
15 while (cur !== null) {
16 if (cur.value === value) return cur
17 cur = cur.next
18 }
19 return null
20}
21
22function remove(head: ListNode | null, value: number): ListNode | null {
23 if (head === null) return null
24 if (head.value === value) return head.next
25 let cur = head
26 while (cur.next !== null && cur.next.value !== value) cur = cur.next
27 if (cur.next !== null) cur.next = cur.next.next
28 return head
29}

Проблема

Часто вставлять и удалять в середине без сдвигов: массиву нужна перекачка хвоста, списку — перестройка одной стрелки. Плата — доступ только по цепочке.

Что вы видите

Узлы в ряд, стрелки next. Вставка в голову: новая стрелка — и голова переназначена, никто не сдвинулся. Поиск — палец cur идёт по стрелкам. Удаление — prev.next перемахивает через узел.

Как это работает

Список платит последовательным доступом: нет индексации, кэш-недружелюбен. Зато вставка/удаление узла после найденного — O(1). Двусвязный добавляет prev (deque, LRU); фиктивный head упрощает крайние случаи.

Пошаговый разбор

  1. 01

    Вставка

    node.next = head; head = node — O(1).

  2. 02

    Поиск

    cur идёт по next до значения.

  3. 03

    Удаление

    prev.next = prev.next.next — узел выпал.

  4. 04

    Цена

    Поиск O(n): стрелки надо пройти ногами.

Complexity и ограничения

time
O(1) вставка, O(n) поиск
space
O(n)

Вставка/удаление O(1) после поиска; поиск O(n). Память — указатели на каждый узел.

Edge cases

  • Пустой список

    head = null — все операции аккуратны с null.

  • Удаление головы

    head сдвигается — особый случай.

  • Цикл

    Испорченный next превращает список в кольцо.

Где встречается в реальности

LRU-кэш

Двусвязный список + хеш-таблица — классическая пара.

Очереди/стеки

Связные списки — естественная основа.

Музыкальные плейлисты

Переставить трек — перецепить пару стрелок.

Связанные алгоритмы

Shorts

«Вставка за O(1): одна стрелка вместо сдвига массива»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

Вставка за O(1): одна стрелка вместо сдвига массива
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/linked-list