2011-10-25 13 views
0

選択ソートを使用してリンクリストをソートする必要があります。 しかし、私はコレクションを使用することはできません。 私は、最小の要素を見つけてソートされたリストの新しいバージョンを作成することに問題があります。おかげさまで そのため、非稼働findSmallestSort方法正常に動作しないの選択ソート二重リンクリストjava

public class LinkedList { 
     public Node first; 
     public Node last; 

     public LinkedList() { 
      first = null; 
      last = null; 
     } 

     public boolean isEmpty() { 
      return first == null; 
     } 

     public void addFirst(Student student) { 
      Node newNode = new Node(student); 
      if (isEmpty()) 
       last = newNode; 
      else 
       first.previous = newNode; 
      newNode.next = first; 
      first = newNode; 
     } 

     public void addLast(Student student) { 
      Node newNode = new Node(student); 
      if (isEmpty()) 
       first = newNode; 
      else 
       last.next = newNode; 
      newNode.previous = last; 
      last = newNode; 
     } 

     public void display() { 
      Node current = last; 
      while (current != null) { 
       System.out.print(current.student.name + "\b"); 
       System.out.print(current.student.surname + "\b"); 
       System.out.println(current.student.educationType); 
       current = current.previous; 
      } 
     } 

。私は並べ替えの方法でノードを置く新しいリストを作成することによって、実装を実装しようとします。そしてそれはまた、それが最大の要素が追加送信

 public void Sort() { 
      LinkedList list = new LinkedList(); 
      Node toStart = last; 
      while (toStart!=null){ 
       list.addLast(findSmallest(toStart).student); 
       toStart = toStart.previous; 
      } 


     } 

「Whileループ」の外に行かないと私は手動でassign'last「to'smallestは」それがうまくいく場合。

 public Node findSmallest(Node toStartFrom) { 
      Node current = toStartFrom; 
      Node smallest = toStartFrom; //if i put here `last` it will work correctly 
      while(current != null) { 
       if (smallest.student.name.compareToIgnoreCase(current.student.name) > 0) smallest = current; 
       current = current.previous; 
      } 
      return smallest; 
     } 

    } 

    public class Node { 
     public Student student; 

     public Node next; 
     public Node previous; 

     public Node(Student student) { 
      this.student = student; 
     } 
    } 


    public class Student { 
     public String name; 
     public String surname; 
     public String educationType; 

     static public Student createStudent() { 
     .... 
      return student; 
     } 
    } 
+0

にこれを有効にするには余りにも難しいことではありません

smallest = startnode
next =startnode.next
while(next != null)
compare next with smallest, and assign accordingly
next = next.next

のようなものを試してみてください。また、これが課題の場合は、宿題としてタグ付けする必要があります。 –

+0

どういう意味で「うまくいきませんか? NPEが動作していないか、ランダムな復帰が動作していないか、または何ですか?また、逆の順序でリストをトラバースする理由はありますか?私はnode.nextが大会になると感じています – SetSlapShot

答えて

1

リンクする必要があるリンクが少ないため、リンクされたリストが2重にならないと便利です。また、if(smallest.student.name.compareToIgnoreCase(current.student.name)> 0)文が実行されたときに、現在のノードと最小ノードを同じノードに初期設定しているため、findSmallest()メソッドで問題が発生する可能性があります。生徒の名前と生徒の同じ名前を比較しています。例えば、最も小さいノードが設定されている場合、生徒の名前がJohnである場合、現在の生徒の名前もJohnになるように、現在の現在のノードが同じノードに設定されます。同じ名前の異なる学生で、コード内で同じ学生で、現在と最小の両方が同じノードを指している場合、問題はありません。効果的に、このif文は常にfalseになり、リストに沿って現在のコードを実行することは決してありません。それはまた、あなたが最小=最後に設定すると、メソッドが少なくとも時間の一部で機能する理由です。上記が言ったように

0

、「動作しない」の定義コード

関連する問題