Если вы хотите потратить немного больше оперативной памяти на процесс, вы можете сделать его намного быстрее, не меняя структуру.
Для настольных приложений я обычно предпочитаю использовать больше оперативной памяти и выигрывать с некоторой скоростью. Так что я бы сделал что-то вроде этого.
removeDuplicates(Node head) {
if (head == null) {
throw new RuntimeException("Invalid List");
}
Node current = head;
Node prev = null;
Set<T> data = new HashSet<T>(); // where T is the type of your data and assuming it implements the necessary methods to be added to a Set properly.
while (current != null) {
if (!data.contains(current.data)) {
data.add(current.data);
prev = current;
current = current.next;
} else {
if (prev != null) {
prev.next = current.next;
current = current.next;
}
}
}
}
Это должно выполняться за O (n) время.
EDIT
Надеюсь, я был прав, предполагая, что это своего рода проект / домашнее задание, в котором вас заставляют использовать связанный список, в противном случае, как уже отмечалось, вам лучше использовать другую структуру данных.