簡體   English   中英

按升序排序雙鏈表

[英]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老臉因為在新的頭部添加的指針。

其他快速的想法:

  • 您應該在構造函數中將init 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM