2015-10-27 3 views
0

Я пытаюсь удалить дубликаты из связанного списка. Однако метод, который я написал, вызывает бесконечный цикл, и я не уверен, почему он есть. Вот мой метод:Удаление дубликатов из связанного списка

import java.util.HashSet; 
import java.util.Hashtable; 

public class Question { 
    public static void deleteDupsB(LinkedListNode n) { 
     LinkedListNode runner = null; 
     LinkedListNode previous = null; 
     while(n != null) { 
      runner = n.next; 
      while(runner != null) { 
       if(n.data == runner.data) { 
        previous.next = runner.next; //This line is causing an infinite loop and I'm not sure why. 
       } 
       else { 
        previous = runner; 
       } 
       runner = runner.next; 
      } 
      n = n.next; 
     } 
    } 

    public static void main(String[] args) {  
     LinkedListNode first = new LinkedListNode(0, null, null); //AssortedMethods.randomLinkedList(1000, 0, 2); 
     LinkedListNode head = first; 
     LinkedListNode second = first; 
     for (int i = 1; i < 8; i++) { 
      second = new LinkedListNode(i % 2, null, null); 
      first.setNext(second); 
      second.setPrevious(first); 
      first = second; 
     } 


     System.out.println(head.printForward()); 
     // LinkedListNode clone = head.clone(); 
     deleteDupsB(head); 
     System.out.println(head.printForward()); 
     // deleteDupsC(clone); 
     // System.out.println(clone.printForward()); 
    } 
} 

Я знаю, что есть некоторые проблемы с ним, такими как runner метанием исключения в конце концов. Но я думаю, я не слишком беспокоюсь об этом прямо сейчас. Я думаю, что этот метод производит эффект, потому что, когда я вставляю break внутри первого цикла while и second, он удаляет все 0s. Во всяком случае, есть ли у вас какие-либо предложения?

+0

Возможный дубликат [Удалить дубликаты из несортированному связанного списка] (http://stackoverflow.com/questions/17643790/remove-duplicates-from-an-unsorted-linked-list) –

+1

Я думаю, что 'предыдущая .next = runner.next; 'запускается в адрес 0, потому что' previous' имеет значение null при первом запуске. Интересно, почему не возникла ошибка доступа к памяти. –

ответ

0

Убедитесь, что методобъекта является звуковым, а затем скопируйте LinkedList на номер LinkedHashSet. Еще лучше, если вам нужно устранить дубликаты, просто используйте LinkedHashSet вместо LinkedList.

+0

Я не думаю, что ему разрешено использовать эти классы, поскольку это, очевидно, для школы. – Kayaman

+0

Ха-ха ... да ... ну, это не для школы, но я изучаю книгу интервью. И один из вопросов был ... – aejhyun

0

Может быть причиной в следующей строке коды:

for(...) { 
    ... 
    first = second; 
} 

Вы должны использовать «первое = второе» только в том случае, если ваш список содержит только 1 элемент.

0

Я бы предложил использовать потоки. Вероятно, он менее эффективен, но он менее подвержен ошибкам, и это экономит много времени.

LinkedListNode list = ...; 
list.stream() 
    // This removes duplicates 
    .distinct() 
    // And this turns it back into a linked list 
    .collect((Supplier<LinkedList<Integer>>) LinkedList::new, 
       LinkedList::add, 
       (left, right) -> { 
        left.addAll(right); 
       } 
      );