2012-01-06 2 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

원래 변수를 반복하지 말고 단지 temp 만 사용해야합니다. 그것이 그것을 참조하기 때문에, 다음에 말하는 것은 현재의 옆에 말하는 것과 같을 것이다. 그런 식으로 머리를 항상 지키고 손길이 닿지 않게하십시오. – 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(); 
    } 
}