2012-03-14 121 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 2012-03-14 02:49:33

+0

@EJP在基於LISP的語言中,您始終對鏈表進行排序 – 2012-03-14 03:04:00

回答

2

使用merge sort算法,通常是best choice用於排序(單個或雙重)鏈接列表。已經有一個討論相關實施問題的post

1

我認爲你應該檢查:

while(temp != null) 

,因爲你已經在while循環結束分配

temp = temp.getNext() 

0

簡單的方法是將列表內容放入數組中,使用Arrays.sort對數組進行排序,最後從排序的數組中重建列表。

+0

此方法將需要遍歷列表,理想情況下,您應該在一次遍歷或O(nlg n)中排序雙向鏈表(使用遞歸時) – 2012-03-14 06:16:42

+0

@ShankhoneerChakrovarty - 這是不正確的。 OP正在進行冒泡排序,並且需要N次遍歷該列表。增加2個遍歷不會影響複雜性。對於任意可比對象的列表,最好不要比'O(NlogN)'比較...大致等同於'O(logN)'遍歷。再一次,增加一個常數2次遍歷不會改變複雜性。 (比'O(NlogN)'更好的排序依賴於被排序的值域的特殊屬性。) – 2012-03-14 06:59:00