Ответ
Временная сложность зависит от позиции вставки:
- O(1) для вставки в начало (
addFirst()) или конец (addLast()) списка. Операция сводится к обновлению ссылок у головного (head) или хвостового (tail) узла. - O(n) для вставки в произвольную позицию по индексу (
add(int index, E element)). Требуется линейный обход для нахождения узла-предшественника.
Пример:
LinkedList<String> list = new LinkedList<>();
list.add("A"); // O(1) - вставка в конец
list.addFirst("B"); // O(1) - вставка в начало
list.add(1, "C"); // O(n) - вставка в середину (требуется обход до индекса 1)
Почему? LinkedList реализован как двусвязный список. Прямой доступ по индексу отсутствует, поэтому нахождение нужной позиции для вставки "в середину" требует последовательного прохода от начала списка.
Ответ 18+ 🔞
Давай разжую, как там у этого LinkedList с вставкой время считается, а то народ путается, будто он везде быстрый, как угорелый.
Смотри, представь цепочку из мудаков, которые держатся за руки. Каждый знает только, кто перед ним и кто сзади. Это и есть наш список. Чтобы кого-то в середину впихнуть, надо по цепочке пройти от первого мудака до нужного места — вот тебе и O(n), обход-то линейный.
Но! Если ты хочешь нового мудака прицепить прямо в начало цепочки (addFirst()) или в конец (addLast()), то это вообще красота. Ты просто берёшь первого (или последнего) в цепочке, говоришь ему: «Держи нового соседа за руку», и всё — O(1), константное время, нихуя не надо обходить.
А вот если лезешь со своим новым элементом куда-то в середину по индексу (add(1, "C")), то тут начинается пиздец. Компьютеру надо, блядь, с самого начала отсчитать: раз, два... вот до этого индекса дойти, найти того мудака, после которого будем вставлять, и только потом перецепить руки. Чем дальше индекс — тем дольше идти. Вот тебе и линейная сложность.
Пример в коде, смотри:
LinkedList<String> list = new LinkedList<>();
list.add("A"); // O(1) — прилепили в конец, быстро и безболезненно
list.addFirst("B"); // O(1) — сунули в начало, тоже моментально
list.add(1, "C"); // O(n) — а вот тут, сука, придётся пройтись от начала до индекса 1, чтобы впихнуть "C" между "B" и "A"
Короче, запомни: в начало/конец — быстро (O(1)), в середину по индексу — потенциально медленно (O(n)), потому что надо идти пешком по всей цепочке, как последний бомж. Ёпта, вот и вся магия.