← Назад к вопросам

Какая алгоритмическая сложность вставки в начало односвязного списка?

1.0 Junior🔥 81 комментариев
#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Алгоритмическая сложность вставки в начало односвязного списка

Вставка элемента в начало односвязного списка имеет алгоритмическую сложность O(1), то есть выполняется за константное время, независимо от текущего размера списка. Это одна из ключевых преимуществ односвязных списков по сравнению с массивами для операций добавления в начало.

Почему O(1)?

В односвязном списке каждый элемент (node) содержит:

  1. Данные (значение)
  2. Ссылку (pointer) на следующий элемент

При вставке в начало требуется всего два шага:

Пример кода (Swift):

class Node<T> {
    var value: T
    var next: Node<T>?
    
    init(value: T) {
        self.value = value
    }
}

class SinglyLinkedList<T> {
    private var head: Node<T>?
    
    func insertAtBeginning(value: T) {
        let newNode = Node(value: value)
        // 1. Устанавливаем ссылку нового узла на текущую голову
        newNode.next = head
        // 2. Обновляем голову списка на новый узёл
        head = newNode
    }
}

Пошаговое объяснение операции:

  1. Создание нового узла – O(1)

    • Аллокация памяти для одного объекта не зависит от размера списка
  2. Установка ссылки newNode.next = head – O(1)

    • Это просто присваивание указателя
  3. Обновление головы списка head = newNode – O(1)

    • Ещё одно присваивание указателя

Все три шага являются элементарными операциями, выполняющимися за фиксированное время.

Сравнение с массивами и другими структурами

Структура данныхВставка в началоПричина
Односвязный списокO(1)Только манипуляции с указателями
Динамический массив (Swift Array)O(n)Необходимо сместить все существующие элементы
Двусвязный списокO(1)Аналогично односвязному, но также обновляется указатель предыдущего элемента

Пример проблемы с массивами:

var array = [1, 2, 3, 4, 5]
// Вставка в начало требует смещения всех элементов
array.insert(0, at: 0) // O(n) операция
// Теперь array = [0, 1, 2, 3, 4, 5]

Практическое применение в iOS разработке

Знание этой особенности важно при:

  • Реализации очередей (FIFO) – где добавление в начало может быть частой операцией
  • Оптимизации производительности – когда необходимо быстро добавлять элементы без реаллокаций
  • Работе с паттернами типа LIFO (стек) – хотя обычно стек реализуется через добавление в конец

Ограничения односвязного списка

Однако O(1) для вставки в начало не означает, что односвязные списки всегда лучше массивов:

  • Поиск по индексу – O(n) против O(1) в массивах
  • Вставка в середину – требует поиска позиции O(n) + вставки O(1)
  • Потребление памяти – дополнительные указатели на каждый элемент

Заключение

Вставка в начало односвязного списка – это операция с константной временной сложностью O(1), выполняемая за два простых присваивания указателей. Это фундаментальное свойство делает односвязные списки идеальным выбором для сценариев, где требуется частое добавление элементов в начало коллекции без затратных перемещений данных, как в массивах. В iOS разработке понимание этих различий помогает выбирать оптимальные структуры данных для конкретных задач производительности.