2012-01-06 14 views
2

のためのリストの最初のノードオフの二重リンクリストカットオーバーマイバブルソートは、ここでの方法何らかの理由

public void sortStudentsAlphabeticallyByFirstName() 
{ 
    StudentNode unsorted = tail; 
    StudentNode current = header; 
    while(unsorted.prevNode() != null) 
    { 
     while(current != unsorted) 
     { 
      int result = (current.getFirstName()).compareToIgnoreCase(current.nextNode().getFirstName()); 
      if(result > 0) //If in wrong order lexicographically 
      { 
       StudentNode temp = current; 
       StudentNode next = current.nextNode(); 
       StudentNode previous = current.prevNode(); 
       StudentNode nextNext = next.nextNode(); 
       if (numberOfStudents() == 2) 
       { 
        current = current.nextNode(); 
        current.setNext(temp); 
        temp.setPrev(current); 
        temp.setNext(null); 
        current.setPrev(null); 
        unsorted = temp; 
       } 
       else if(nextNext == null) //If at penultimate student therefore last comparison 
       { 
        current = current.nextNode(); 
        current.setNext(temp); 
        temp.setPrev(current); 
        temp.setNext(null); 
        previous.setNext(current); 
        current.setPrev(previous); 
        unsorted = temp; 
       } 
       else if(previous == null) //if at beginning of student list 
       { 
        if(current.nextNode() == unsorted) 
        { 
         current = current.nextNode(); 
         current.setNext(temp); 
         temp.setPrev(current); 
         temp.setNext(nextNext); 
         nextNext.setPrev(temp); 
         current.setPrev(null); 
         unsorted = temp; //swap unsorted back to correct position 
        } 
        else 
        { 
         current = current.nextNode(); 
         current.setNext(temp); 
         temp.setPrev(current); 
         temp.setNext(nextNext); 
         nextNext.setPrev(temp); 
         current.setPrev(null); 
        } 
       } 
       else //else if in the middle of the list 
       { 
        if(current.nextNode() == unsorted) 
        { 
         current = current.nextNode(); 
         current.setNext(temp); 
         temp.setPrev(current); 
         temp.setNext(nextNext); 
         nextNext.setPrev(temp); 
         previous.setNext(current); 
         current.setPrev(previous); 
         unsorted = temp; 
        } 
        else 
        { 
         current = current.nextNode(); 
         current.setNext(temp); 
         temp.setPrev(current); 
         temp.setNext(nextNext); 
         nextNext.setPrev(temp); 
         previous.setNext(current); 
         current.setPrev(previous); 
        } 
       } 
      } 
      current = current.nextNode(); 
     } 
     current = header; 
     unsorted = unsorted.prevNode(); 
    } 
} 

私は反復処理しようとすると、それがリストの先頭をカットなぜ誰もが見ることができるのですもう一度リスト?私はデバッガを使用しましたが、それは実行する必要がありますが、私はそれをやっている理由を解決することはできません。それはあなたのコードの

public void itterateList() 
{ 
    StudentNode u = header; 
    while(u != null) 
    { 
     System.out.println(u.getFirstName()+" "+u.getSurname()); 
     u = u.nextNode(); 
    } 
} 
+3

バブルソート:

には、以下のシンプルなコードを試してみてください。私を始めさせないで! –

+0

元の変数を反復するのではなく、一時的なものだけを繰り返すべきです。それを参照して以来、それについてのことは、現在の隣にあるということと同じであると言っています。そうすれば、あなたはいつも頭を守り、手を触れない。 – Andy

+0

@Andy申し訳ありませんが、私はあなたが意味するものをかなり得ていません。どの元の変数? –

答えて

0

主な問題は、ヘッダーとテールが更新されません取得することである場合に役立ちます。ここ

は、反復リスト方式も同様です。

public void sortStudentsAlphabeticallyByFirstName() 
{ 
    StudentNode unsorted = tail; 
    StudentNode current = header; 
    while(unsorted.prevNode() != null) 
    { 
     while(current != unsorted) 
     { 
      StudentNode next = current.nextNode(); 
      int result = (current.getFirstName()).compareToIgnoreCase(next.getFirstName()); 
      if (result>0) // current is greater than next 
      { 
       // need to exchange : next will be before current 
       // HEADER (before) CURRENT NEXT (after) TAIL 
       // HEADER (before) NEXT CURRENT (after) TAIL 

       // 1 - Before current 
       if (current.prevNode() != null) 
        current.prevNode().setNext(next); 
       else header = next; 

       // 2 - After next 
       if (next.nextNode() != null) 
        next.nextNode().setPrev(current); 
       else tail = current; 

       // 3 - current <-> next 
       current.setNext(next.nextNode()); 
       next.setPrev(current.prevNode()); 
       current.setPrev(next); 
       next.setNext(current); 

       // Don't need to update current which is 
       // already pointing to the greatest element 
      } 
      // next is greater than current -> update current 
      else current = current.nextNode(); 
     } 
     current = header; 
     unsorted = unsorted.prevNode(); 
    } 
} 
関連する問題