2012-03-14 97 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