Удалить 10000-й узел в связанном списке

У меня есть связанный список из n узлов, я хочу удалить k-й узел и отобразить элемент в нем. Это легко, если значение n относительно мало и сложность проблемы не является проблемой.

Проблема в том, что у меня есть n узлов в связанном списке, где n >=200000, и я хочу удалить узел, который также является относительно большим значением (скажем, k=150000).

Обычным решением этой проблемы является обход всего связанного списка и удаление узла (где сложность решения O(n)), хотя это прямое и простое решение, требующее больше времени. Другое решение этой проблемы может иметь 2 указателя, но это не является оптимальным решением.

Я ищу решение, которое является оптимальным и обеспечивает результат за минимальное количество времени.

Надеюсь, мой вопрос ясен. Нужна помощь..

3 ответа

Решение

Используйте концепцию SkipList.

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

Вам нужно создать несколько слоев, чтобы можно было без колебаний пропустить некоторые узлы.

TC: то же среднее время выполнения, что и у дерева двоичного поиска O(log n),

Не требует сложной реорганизации данного связанного списка.

У вас есть связанный список, поэтому у вас есть доступ O(n). Я вижу два варианта: изменить ваш контейнер или использовать дополнительный контейнер для ускорения прямого доступа (увеличить сложность пространства). Вы не найдете магический контейнер с O(1) сложность для всех видов лечения.

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

Если вы знаете, что вам часто требуется доступ к элементу, индекс которого известен, вероятно, лучше просто использовать массив. (Хотя перечитывание вопроса, это все равно не поможет удалить элемент)

Другие вопросы по тегам