2012-01-06 21 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(); 
    } 
} 

有人能看到爲什麼它切斷了列表的開始,當我嘗試迭代再次列表?我已經使用了調試器,它似乎應該運行,但我不知道爲什麼它會這樣做。

這裏的迭代list方法以及它是否有助於

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

冒泡。不要讓我開始! – 2012-01-06 01:16:31

+0

您不應該遍歷原始變量,而只能通過temp。既然它引用了它,那麼接下來說的就和旁邊的現在一樣。這樣你就可以隨時保持頭腦不受影響。 – Andy 2012-01-06 01:18:09

+0

@安迪抱歉,我不完全明白你的意思。哪個原始變量? – 2012-01-06 01:27:38

回答

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