Как сложность добавления (int, E) LinkedList O (1) сложности?

Изсвязанный список отрывок тега вики:

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

(акцент мой)

Я был удивлен, прочитав это - как можно списоквставить по случайному индексу с меньшей сложностью, чем просточтение этот индекс?

Итак, я посмотрел наисходный код дляjava.util.LinkedList,add(int, E) метод является:

public void add(int index, E element) {
    addBefore(element, (index==size ? header : entry(index)));
}

addBefore(E, Entry<E> метод это просто переназначение указателя, но есть такжеentry(int) метод:

if (index < 0 || index >= size)
        throw new IndexOutOfBoundsException("Index: "+index+
                                            ", Size: "+size);
    Entry<E> e = header;
    if (index < (size >> 1)) {
        for (int i = 0; i <= index; i++)
            e = e.next;
    } else {
        for (int i = size; i > index; i--)
            e = e.previous;
    }
    return e;
}

Даже с оптимизацией половинного размера,for цикл здесь (один или другой) кажется мне мертвой раздачей, что этот метод (и, следовательно,add(int, E)) работает в минимальном наихудшем случае O (n) времени и, конечно, не постоянное время.

Что мне не хватает? Я неправильно понимаю обозначение big-O?

Ответы на вопрос(4)

Ваш ответ на вопрос