Ниже приведен алгоритм O (N ^ 2), который не использует никаких временных дополнительных коллекций.Итерация в обратном направлении, от последнего ко второму элементу, если текущий элемент списка уже присутствует ранее в списке, затем удаляет текущий элемент.
public static void removeDuplicates(List<?> list) {
ListIterator<?> iter = list.listIterator(list.size());
for (int index = list.size() - 1; index > 0; index--) {
Object element = iter.previous();
if (list.subList(0, index).contains(element))
iter.remove();
}
}
Test:
@Test
void removeDuplicatesShouldRemoveAllDuplicates() {
List<Integer> list = new LinkedList<>(Arrays.asList(1,2,1,3,1,4,5,5,1));
Main.removeDuplicates(list);
assertEquals(Arrays.asList(1,2,3,4,5), list);
}