Думайте об этом как о двух односвязных списках вместо одного двусвязного списка, с одним набором ссылок, идущим с первого по последний, а другим набором с последнего на первый. Вы можете отсортировать второй список с помощью сортировки слиянием, которая будет O (n log n). Теперь просмотрите список, используя первую ссылку. Для каждого узла проверьте, если (node.back)->key==node.key
, и если это так, удалите его из списка. Восстановите обратный указатель во время этого обхода, чтобы список снова был правильно связан дважды.
Это не обязательно самый быстрый метод, но он не использует дополнительное пространство.