我有一個充滿 Book 物件的 LinkedList,這些物件存盤在 Nodes 中,其中包含出版年份和書名。我正在嘗試對串列進行排序,使其從最早的年份到最近的年份排列,但是,在第一本書之后,我的其余書籍現在具有相同的標題和出版年份。我相信這與我使用 setBook 方法進行交換有關。
public void sortByYear(){
Node current = head;
Node next = null;
if(isEmpty()){ //if the head is null
return;
}
while(current != null){
next = current.getNext();
while(next != null){
if(current.getBook().getYear() > next.getBook().getYear()){
Book temp = current.getBook();
current.setBook(next.getBook().getYear(), next.getBook().getTitle());
next.setBook(temp.getYear(), temp.getTitle());
// current.getBook() = next;
// next.getBook() = temp;
}
next = next.getNext();
}
current = current.getNext();
}
}
uj5u.com熱心網友回復:
幾個問題:
你的
setBook方法——用一年和標題——似乎改變了分配給節點的書。這并不是真正正確的方法。您應該定義一個方法,使書籍保持不變,但將不同的書籍(全部一起)分配給一個節點。冒泡排序將始終從串列中的第一項開始內回圈。外回圈僅用于計算內回圈必須啟動的次數。這不是您實作它的方式。如果最小節點不在第一位或第二位,您的演算法將永遠不會將其一直移回第一位。
我建議采取不同的方法,只改變next串列中的參考,這樣你就可以整體交換節點,而根本不必接觸資料。為此,您需要一個prev在當前節點“后面”的參考,以便您可以將前面的節點重新連接到與當前節點交換的節點。
這是一個實作:
public void sortByYear(){
if (head == null || head.getNext() == null) {
return;
}
for (Node iter = head; iter != null; iter = iter.getNext()) {
Node prev = null;
Node current = head;
for (Node next = current.getNext(); next != null; next = current.getNext()) {
if (current.getBook().getYear() > next.getBook().getYear()) {
if (prev == null) {
head = next;
} else {
prev.setNext(next);
}
current.setNext(next.getNext());
next.setNext(current);
prev = next;
} else {
prev = current;
current = next;
}
}
}
}
你仍然可以做的事情
如果你能讓你的Node班級具有可比性,那就更好了。這樣,if陳述句就可以變得更加通用,并且與您的書籍相關實作的聯系更少。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/393628.html
