3

私の二重リンクリストをソートする方法を理解しようとしています。ここでnullポインタ例外が発生します:

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

3 に答える 3

2

マージ ソートアルゴリズムを使用します。多くの場合、(1 つまたは 2 つの) リンク リストをソートするのに最適です。関連する実装の問題について議論している投稿が既にあります。

于 2012-03-14T02:44:22.403 に答える
1

以下を確認する必要があると思います。

while(temp != null)

すでに割り当てているため

temp = temp.getNext()

whileループの終わりに。

于 2012-03-14T02:31:48.277 に答える
0

簡単な方法は、リストの内容を配列に入れ、それを使用Arrays.sortして配列をソートし、最後にソートされた配列からリストを再構築することです。

于 2012-03-14T02:38:14.720 に答える