2012-03-14 6 views
3

Попытка выяснить, как сортировать мой список, связанный дважды. я получаю исключение нулевого указателя здесь:Метод сортировки для двусвязного списка

while (temp.getNext()!=null){ 

Есть ли лучший подход или любой совет, чтобы получить это происходит правильный путь?

public void sort() { 
    //bubble sort! 
    boolean swapped = (head != null); 
    while (swapped) { 
     swapped = false; 

     EntryNode temp = head; 

     //can't swap something with nothing 
     while (temp.getNext()!=null){ 
      if (temp.getLastName().compareTo(temp.getNext().getLastName()) > 0) { 
       swapped = true; 

       //special case for two nodes 
       if (size == 2) { 
        //reassign head and tail 
        tail = temp; 
        head = temp.getNext(); 
        tail.setPrev(head); 
        head.setNext(tail); 
        tail.setNext(null); 
        head.setNext(null); 
       } 
       //if swapping is at head 
       else { 

        if (temp == head) { 
         head = temp.getNext(); 
         temp.setNext(head.getNext()); 
         head.getNext().setPrev(temp); 
         head.setPrev(null); 
         head.setNext(temp); 
         temp.setPrev(head); 
        } 

        else { 
         temp.setNext(temp.getNext().getNext()); 
         temp.setPrev(temp.getNext()); 
         temp.getNext().setNext(temp); 
         temp.getNext().setPrev(temp.getPrev()); 
        } 
       } 
      } 
      //loop through list 
      temp = temp.getNext(); 
     } 
    } 
} 
+1

Это должно быть домашнее задание. Вы не сортируете связанные списки в реальном мире. – EJP

+0

@EJP В языках на основе LISP вы все время сортируете связанные списки –

ответ

2

Использование алгоритма merge sort, часто является best choice для сортировки (одного или двух) связанных списков. Уже есть post, где обсуждаются соответствующие проблемы реализации.

1

Я думаю, вы должны проверить:

while(temp != null) 

, потому что вы уже назначая

temp = temp.getNext() 

в конце цикла while.

0

Простой подход состоит в том, чтобы поместить содержимое списка в массив, используйте Arrays.sort для сортировки массива и, наконец, перестройте список из отсортированного массива.

+0

Этот подход потребует двух обходов списка, в идеале вам следует отсортировать дважды связанный список в одном обходе или в O (nlg n) (при использовании рекурсии) –

+0

@ShankhoneerChakrovarty - Это неверно. ОП выполняет сортировку пузырьков, и для этого требуется N обходов списка. Добавление еще двух обходов не повлияет на сложность. Невозможно сортировать список произвольных сопоставимых объектов лучше, чем сравнения «O (NlogN)», которые примерно равны обходам «O (logN)». И снова добавление постоянных 2 дополнительных обходов не изменяет сложность. (Виды, которые лучше, чем 'O (NlogN)', зависят от специальных свойств области сортируемых значений.) –

Смежные вопросы