2015-05-06 77 views
5

我對LinkedList有點新,我想通過在ExampleLinkedList類中創建方法來練習。 test3中有一個列表。當我打電話給test3時,我得到了再見,謝謝你好。我想要的是在列表的末尾添加「AddedItem」以獲得AddedItem Goodbye謝謝你好,但我只得到了AddedItem作爲結果。如何修改我的addToEnd方法而無需編寫新類。在一個類中添加一個對象到鏈接列表的末尾

public class ExampleLinkedList 
{ 
    private String data; 
    private ExampleLinkedList next; 

    public ExampleLinkedList(String data,ExampleLinkedList next) 
    { 
     this.data = data; 
     this.next = next; 
    } 

    public void addToEnd(String item) 
    { 
     while(next != null) 
     { 
      data = item; 
      next.data = data; 
      next = next.next; 
     } 
    } 

    public boolean isEmpty() 
    { 
     if(next == null) 
     { 
      return true; 
     } 
     return false; 
    } 

    public String toString() 
    { 
     String result = data; 
     while(next != null) 
     { 
      result = result + " " + next.data; 
      next = next.next; 
     } 
     return result; 
    } 

} 

public class Test 
{  

    public static void main(String[] args) 
    { 
     ExampleLinkedList test1 = new ExampleLinkedList("Hello", null); 
     ExampleLinkedList test2 = new ExampleLinkedList("Thanks", test1); 
     ExampleLinkedList test3 = new ExampleLinkedList("Goodbye", test2); 

     test3.addToEnd("AddedItem"); 
     System.out.println(test3); 
    } 
} 
+1

這不是開始時的加法嗎?因爲它是第一個因素。 – Bubletan

+0

我只將AddItem作爲輸出。如何更新循環中下一個對象的所有數據? – hackerboy

回答

3

這應該工作。這將設置item爲鏈表

public void addToEnd(String item) 
{ 
    ExampleLinkedList newNode = new ExampleLinkedList(data, next); 
    data = item; 
    next = newNode; 
} 
+0

看起來很簡單。我希望以前能夠實現它。謝謝。 – hackerboy

1

如何以下,因爲它是一個新的節點......

public ExampleLinkedList addToEnd(String item) 
{ 
    return new ExampleLinkedList(item,this); 
} 

充滿代碼可能是...

public class ExampleLinkedList 
{ 
    private String data; 
    private ExampleLinkedList next; 

    public ExampleLinkedList(String data, ExampleLinkedList next) 
    { 
     this.data = data; 
     this.next = next; 
    } 

    public ExampleLinkedList addToEnd(String item) 
    { 
     return new ExampleLinkedList(item,this); 
    } 

    public boolean isEmpty() 
    { 
     if(next == null) 
     { 
      return true; 
     } 
     return false; 
    } 

    public String toString() 
    { 
     String result = data; 
     while(next != null) 
     { 
      result = result + " " + next.data; 
      next = next.next; 
     } 
     return result; 
    } 


    public static void main(String[] args) 
    { 
     ExampleLinkedList test1 = new ExampleLinkedList("Hello", null); 
     ExampleLinkedList test2 = new ExampleLinkedList("Thanks", test1); 
     ExampleLinkedList test3 = new ExampleLinkedList("Goodbye", test2); 

     ExampleLinkedList myItem = test3.addToEnd("AddedItem"); 
     System.out.println(myItem); 
    } 
} 

輸出:

AddedItem Goodbye Thanks Hello 
+0

它的工作表示感謝,但我想知道是否有任何方式使用它通過使用void addToEnd方法? – hackerboy

+0

事情是你是**添加一個新的節點**,所以你需要一個**處理**到第一個/最後一個節點(你可以看到它的兩種方式)..一旦你有它,你需要設置指針..在這裏,我們已經避免了所有不必要的代碼,只是調用構造函數來建立正確的列表... –

+0

如果你檢查你的代碼,你會看到你調用'System.out .println(test3);'在** test3 **這是尷尬/數據移動來處理和獲得最後一個節點的訪問權限「AddedItem」 –

1

addToEnd方法有幾個問題之首。讓我們一步一步來說明問題。

  1. 當您調用test3.addToEnd時,首先檢查while循環條件,並且因爲next不爲空,所以您輸入循環。
  2. 發生的第一件事是將當前節點的數據從「再見」重新指定爲「已添加的項目」(但您並未在任何地方存儲原始值)。
  3. 然後,您將下一個節點的數據分配給新數據(由於它在上一步中被重新分配,所以現在是「AddedItem」而不是「Goodbye」)。
  4. 當前next設置爲下一個節點的next,有效地從列表中刪除「謝謝」。
  5. 重複循環,這次從列表中刪除「hello」。

此時,剩下的唯一東西就是最初是「再見」但已被更改爲「AddedItem」的節點,因此這就是所有打印的結果。

什麼,你可能應該做的是有addToEnd創造ExampleLinkedList一個新的實例,並指出其next當前節點,就像這樣:

public ExampleLinkedList addToEnd(String item) 
{ 
    return new ExampleLinkedList(item, this); 
} 

然後改變你的測試的最後兩行是什麼像這樣:

ExampleLinkedList test4 = test3.addToEnd("AddedItem"); 
System.out.println(test4); 

或者,你可以避開addToEnd()方法完全和增加新的節點時,只需使用構造函數。這是因爲addToEnd()在這一點上是多餘的,因爲它只是構造函數的一個包裝。

+0

非常好的解釋。謝謝。 – hackerboy

相關問題