[英]sorting doubly linked lists by ascending order
我需要按照ID的升序對包含其ID,姓名,年齡和GPA的學生列表進行排序。 我的方法insertAscending正在嘗試執行此操作,但由於某種原因無法正常工作。 我的私有內部Node類也包括在內。 任何幫助將不勝感激。
public class StudentInfo
{
//Node class (inner class)
private class Node
{
private int id;
private String name;
private int age;
private double gpa;
private Node next;
private Node prev;
//constructor of Node
private Node(int id, String name, int age, double gpa, Node prev, Node next)
{
this.id = id;
this.name = name;
this.age = age;
this.gpa = gpa;
this.prev = prev;
this.next = next;
}
}
/*******************************************************************/
private Node head;
private Node tail;
int size;
//constructor of list
public StudentInfo()
{
head = null;
tail = null;
}
/*********************************************************************/
public void insertAscending(int id, String name, int age, double gpa)
{
if (head == null)
{
head = tail = new Node(id, name, age, gpa, null, null );
size ++;
}
//insert at beginning
else if( id < head.id)
{
head = new Node(id, name, age, gpa, null, head);
size ++;
}
//insert at end
else if(id > tail.id)
{
tail = new Node(id, name, age, gpa, tail, null);
size++;
}
//insert at other positions
else
{
for(Node temp = head; temp.next != null; temp = temp.next)
{
if (id > temp.id && id < temp.next.id)
{
temp.next = new Node(id, name, age, gpa, temp, temp.next);
temp.next.next.prev = temp.next;
size++;
break;
}
}
}
}
}
這是作業的一部分嗎? 您是否需要為此使用雙鏈表?
將LinkedList保持在已排序的順序中會否定LinkedList的很多好處,LinkedList的頭和尾是O(1)插入。 通常,對我來說,這聽起來像是TreeMap的工作,其中鍵是學生ID,值是Student對象。 這樣一來,您就可以按學生證的順序進行迭代,並且查找速度更快。
關於此代碼的實際問題,我認為您忘記更新列表中已有節點的某些頭/尾(而不是要插入的頭/尾)。 例如,我認為您的else / if階梯中添加新尾巴的部分應如下所示:
else if(id > tail.id)
{
Node newTail = new Node(id, name, age, gpa, tail, null);
tail.next = newTail;
tail = newTail;
size++;
}
以前,您沒有更新舊尾巴的next
指針。 同樣,我認為您設置新頭的代碼應如下所示:
else if( id < head.id)
{
Node newHead = new Node(id, name, age, gpa, null, head);
head.prev = newHead;
head = newHead;
size ++;
}
你沒有設置prev
老臉因為在新的頭部添加的指針。
其他快速的想法:
size
顯式初始化為0
但是,除了更正任何其他錯誤之外,我認為更大的問題是:您如何對此進行測試? 我僅通過運行一些快速測試就很容易發現其中一些錯誤。 我在類中添加了一些便捷方法(僅用於測試...有更好的迭代器方法):
public void print()
{
for(Node temp = head; temp != null; temp = temp.next)
{
System.out.println(temp.name);
}
}
public void printReverse()
{
for(Node temp = tail; temp != null; temp = temp.prev)
{
System.out.println(temp.name);
}
}
然后,我添加了一個簡單的main
方法,如下所示:
public static void main(final String[] args)
{
StudentInfo si = new StudentInfo();
si.insertAscending(2, "Brent", 23, 2.2);
//si.insertAscending(3, "Steve", 23, 2.2);
//si.insertAscending(5, "Joe", 23, 2.2);
//si.insertAscending(4, "Pat", 23, 2.2);
//si.insertAscending(1, "Mike", 23, 2.2);
si.print();
System.out.println("==========");
si.printReverse();
}
即使不使用調試器或其他工具,也可以很容易地發現問題所在。 一旦確定單元素案例有效,就取消了對下一個insertAscending
調用的注釋,直到所有步驟都奏效為止。
我在這里沒有提到的代碼中可能有其他錯誤,也可能沒有。 我認為真正重要的是,您了解我是如何發現這些錯誤的,並且您想出了一種更好的方法來測試您的代碼並說服它正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.