Я рассматриваю некоторые фрагменты кода для предстоящего теста.Я видел это в своих заметках и только сейчас понял, что этот код для метода 1 на самом деле не удаляет дубликаты, если список таким образом A -> B -> C -> A. Я написал альтернативную функцию (метод 2)что я думаю на самом деле будет работать.Что, вы парни, думаете?Метод 1 на самом деле не работает, и я отслеживаю это неправильно?ps В настоящее время мы не можем использовать компиляторы:)
Вот код и краткое описание того, что он должен делать.
МЕТОД 1: Что я думаю, что не работает, когда есть2 точные вещи в голову и хвост.Напишите код для удаления дубликатов из несортированного списка БЕЗ буфера.Wwe может выполнять итерацию с двумя указателями: «current» выполняет обычную итерацию, в то время как «runner» выполняет итерацию по всем предыдущим узлам для проверки на наличие ошибок.Бегун увидит только один дубликат на узел, потому что, если бы было несколько дубликатов, они уже были бы удалены.
public static void deleteDuplicates1(LinkedListNode head) {
if (head == null) return;
LinkedListNode previous = head;
LinkedListNode current = previous.next;
while (current != null) {
LinkedListNode runner = head;
while (runner != current) { // Check for earlier dups
if (runner.data == current.data) {
LinkedListNode tmp = current.next; // remove current
previous.next = tmp;
current = tmp; // update current to next node
break; // all other dups have already been removed
}
runner = runner.next;
}
if (runner == current) { // current not updated - update now
previous = current;
current = current.next;
}
}
}
Я думал, что это сработает.МЕТОД 2:
public void removeDuplicates2(){
Node current = null;
Node tracer = null;
for( current = head.next; current!=null; current=current.next){
for(tracer=head; tracer!=current; tracer=tracer.next){
if(tracer.data == current.data)
//DELETE THE NODE IN CURRENT
}
}
}