[英]Selection sort Doubly linked list 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;
}
}
由於findSmallest
方法無法正常工作, findSmallest
Sort
方法無法正常工作。 我試圖通過創建一個新列表來實現排序,在該列表中我將Nodes進行排序。 而且它也不會超出“ While loop”
public void Sort() {
LinkedList list = new LinkedList();
Node toStart = last;
while (toStart!=null){
list.addLast(findSmallest(toStart).student);
toStart = toStart.previous;
}
}
它發送添加的最大元素,如果我手動將“ last”分配給“ 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;
}
}
沒有雙向鏈接列表可能會有所幫助,因為這樣一來,您需要維護的鏈接就會減少。 另外,您可能在findSmallest()方法上遇到麻煩,因為您最初將當前和最小設置為同一節點,因此當執行if(smallest.student.name.compareToIgnoreCase(current.student.name)> 0)語句時您正在將學生的姓名與學生的姓名進行比較。 例如,如果將最小的節點設置為具有John的學生名,那么current當前被設置為同一節點,因此current的學生名也是John。 如果他們是同名的不同學生,但在您的代碼中他們是同一學生,並且當前和最小指向同一節點,這不是問題。 實際上,此if語句始終會為false,並且您將永遠不會執行代碼以使電流沿列表移動。 這就是為什么當您設置minimum = last時,該方法至少在某些時候有效。
如上所述,嘗試類似
smallest = startnode
next =startnode.next
while(next != null)
compare next with smallest, and assign accordingly
next = next.next
將其轉換為代碼應該不太難
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.