Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 双链表排序方法_Java_Algorithm_Sorting_Doubly Linked List - Fatal编程技术网

Java 双链表排序方法

Java 双链表排序方法,java,algorithm,sorting,doubly-linked-list,Java,Algorithm,Sorting,Doubly Linked List,试图找出如何排序我的双链接列表。 我在这里得到一个空指针异常: while (temp.getNext()!=null){ 有没有更好的方法或建议让事情朝着正确的方向发展 public void sort() { //bubble sort! boolean swapped = (head != null); while (swapped) { swapped = false; EntryNode temp = head;

试图找出如何排序我的双链接列表。 我在这里得到一个空指针异常:

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();
        }
    }
}

我想你应该检查一下:

while(temp != null)
因为你已经在分配任务了

temp = temp.getNext()

while
循环结束时。

简单的方法是将列表内容放入一个数组中,使用
数组。sort
对数组进行排序,最后从排序后的数组重建列表。

使用该算法,通常是对(单或双)链接列表进行排序的最佳方法。已经有一个小组在讨论相关的实施问题。

这必须是家庭作业。在现实世界中,您不会对链表进行排序。@在基于LISP的语言中,EJP总是对链表进行排序。这种方法需要对链表进行两次遍历,理想情况下,您应该在一次遍历中或在O(nlg n)(使用递归时)中对双链表进行排序@ShankhoneerChakrovarty-这是不正确的。OP正在进行冒泡排序,这需要对列表进行N次遍历。再添加两次遍历不会影响复杂性。可以证明,在优于
O(NlogN)
的比较中,不可能对任意可比较对象列表进行排序。。。这大致相当于
O(logN)
遍历。再一次,再添加两次常量遍历不会改变复杂性。(优于
O(NlogN)
的排序依赖于被排序的值域的特殊属性。)