Измените структуру списка для хранения начальной позиции каждого элемента, например, для сохранения кортежа индекса, значения вместо значения для каждого элемента:
['a', 'x', 'b', 'w', 'e']
становится
[{'a', 0}, {'x', 1}, {'b', 2}, {'w', 3}, {'e', 4}]
Затем запустите вставки и удаления, присваивая каждой новой вставке индекс -1, чтобы указать, что ее нет в исходном списке:
[{'j', -1}, {'x', 1}, {'b', 2}, {'u', -1}, {'w', 3}]
Теперь создайте массив 'newIndexArray', равный исходному размеру списка, инициализируйте все значения -1, а затем выполните итерации по новому списку, увеличивая счетчик, начиная с нуля, чтобы отслеживать новую позицию. Для каждого элемента установите:
newIndexArray[elementTuple.Item2] = counter
newIndexArray
теперь будет связываться со следующими значениями:
newIndexArray[0] = -1
newIndexArray[1] = 1
newIndexArray[2] = 2
newIndexArray[3] = 4
newIndexArray[4] = -1
-1 означает, что элемент, который был первоначально в этой позиции, был удален.
Алгоритм: O (N) для всего списка или O (1) на элемент. Существует O (1) дополнительная стоимость за вставку и (инициализация индекса -1)