2016-07-19 68 views
-2

我在JAVA中創建了一個程序,將元素添加到LinkedList中,並在添加元素的同時對元素進行排序。我在排序的情況下使用的技術swap類似於將節點添加到LinkedList的開始時使用的技術。該技術適用於後者,但未能在前者中運行。我不明白爲什麼這不起作用。以下是我的代碼供您參考。爲什麼我不能使用此Java代碼對用戶定義的LinkedList進行排序?

//Node class 
class Node{ 
    int d; Node link; 
    Node(int d){ 
     this.d = d; 
     link = null; 
    } 
}//Node 

//LinkedList class 
class LL{ 
    Node start; 
    LL(){ 
     start = null; 
    } 

    //method to add and sort the nodes 
    //in ascending order of the values of 'd' of the nodes 
    void insert(Node nd){ 
     if(start==null){ 
      start = nd; 
     } 
     else{ 
      Node temp = start; 
      while(temp!=null){ 
       if(nd.d<=temp.d){ 
        Node t2 = temp; 
        temp = nd; 
        nd.link = t2; 
        break; 
       } 
       temp = temp.link; 
      } 
     } 
    }//insert 

    //method to display nodes of the LinkedList 
    void display(){ 
     Node temp = start; 
     do{ 
      System.out.print(temp.d + " "); 
      temp = temp.link; 
     }while(temp!=null); 
    }//display 
}//LL 

//Main class 
class LL_Test{ 
    public static void main(String[] args){ 
     LL myLL = new LL(); 
     myLL.insert(new Node(5)); 
     myLL.insert(new Node(2)); 
     myLL.insert(new Node(7)); 
     myLL.insert(new Node(6)); 
     myLL.insert(new Node(1)); 
     myLL.display(); 
    }//main 
}//LL_Test 

預計輸出1 2 5 6 7
獲得輸出5

回答

2

你永遠不會實際添加一個元素,除了第一個元素到列表。 (temp = nd;不會將前一個節點的鏈接設置爲nd)。你需要保持前一個節點的跟蹤和元素後添加新的第一個比你想

void insert(Node nd) { 
    Node temp = start; 
    Node previous = null; 

    while (temp != null && temp.d < nd.d) { 
     previous = temp; 
     temp = temp.link; 
    } 

    // insert node 
    if (previous == null) { 
     // insert at start 
     nd.link = start; 
     start = nd; 
    } else { 
     // insert somewhere in the middle 
     nd.link = temp; 
     previous.link = nd; 
    } 
}//insert 
+1

不應該是temp.d <= nd.d? – SomeDude

+1

@svasa:不完全。終止條件是'nd.d <= temp.d',所以它應該是'!(nd.d <= temp.d)'='nd.d> temp.d'。但基本上你是對的。修正了這個 – fabian

+0

@progy_rock:我剛剛測試過,結果是'1 2 5 6 7'。請注意,svasa指出我剛剛修復了一個問題,但這會產生相反的順序... – fabian

1

兩個意見,既適用於insert()start != nullwhile(temp!=null)循環中:

  1. 條件是不很對(我認爲) - 按升序排列,您希望向前跳過,直到找到具有temp.d <= nd.d的節點,或者temp.link==nulltemp.link.d >= nd.d
  2. while循環的主體insert中,您設置了nd.link以便新節點指向另一個節點。但是,您不要設置temp.link=nd或類似的任何東西,將新節點掛接到從start開始的鏈中。
+0

1嗯,我使用這個算法在有序數組中插入一個元素,並且它工作。所以我想這個邏輯是對的。看到。假設LL的節點是「1 2 3 5 6」,我想添加「新節點(4)」。現在,如果我執行了'temp.d <= n.d',那麼'start'處的'1'爲'<= 4',因此插入將發生在這裏,這將是錯誤的。 2.我所嘗試的是**在t2 **中保存溫度值,**分配溫度= nd **,現在將** nd.link的值賦予t2,即溫度的原始值**。 – progyammer

1

我拿到這個的一個大前:

void insert (Node nd) 
{ 
    Node temp = start; 
    Node previous = null; 
    while (temp != null) 
    { 
     if (nd.d <= temp.d) 
     { 
      nd.link = temp; 
      if (nd.d < start.d) 
      { 
       start = nd; 
      } 
      break; 

     } 
     previous = temp; 
     temp = temp.link; 
    } 
    if(previous != null) 
    { 
     previous.link = nd; 
    } 
    if(start == null) 
    { 
     start = nd; 
    } 


} 
相關問題