2016-08-13 51 views
0

末插入節點我寫了這個代碼在linkedlist的末尾插入一個節點,但我只得到了當我打印列表中的第1個要素:誤差在鏈表中的Java

public class LinkedList { 

    public class Link{ 

     private int data; 
     private Link next; 

     public Link(int data,Link next){ 
      this.data = data; 
      this.next = next; 
     } 

     public void printLink(){ 

      System.out.print(data); 
     } 

    } 

    private Link head; 

    public LinkedList(){ 
     head = null; 
    } 

    public void insertNode_end(int data1){ 

     Link node = new Link(data1,null); 

     if(head == null){ 

      node.next = head; 
      head = node; 
     } 

     else{ 
      Link ptr = head; 
      while(ptr != null){ 
       ptr = ptr.next; 
      } 

      node.next = null; 
      ptr = node; 

     } 
    } 

public void printList(){ 
     Link curr_node = head; 
     while(curr_node != null){ 
      curr_node.printLink(); 
      curr_node = curr_node.next; 
     } 
    } 

    public static void main(String args[]){ 

     LinkedList obj = new LinkedList(); 

     obj.insertNode_end(1); 
     obj.insertNode_end(2); 
     obj.insertNode_end(3); 
     obj.insertNode_end(4); 
     obj.insertNode_end(5); 

     obj.printList(); 
    } 

} 

我只看到1正在打印。我也試圖做ptr.next = node,但它然後拋出null pointer exception

我在這裏犯的錯誤是什麼?

+1

我建議您在IDE的調試器中逐步調試代碼,以幫助調試代碼。 –

回答

1

讓我們仔細看看head不是null

Link ptr = head; 
while(ptr != null){ 
    ptr = ptr.next; 
} 

當這個循環結束ptrnull。可能不是你想要的(我想你希望它是列表中的最後一個元素)。你可能想將其更改爲:

Link ptr = head; 
while(ptr.next != null){ 
    ptr = ptr.next; 
} 

注意,也不會造成NPE,因爲我們知道頭不爲空。在下一部分。

node.next = null; 
ptr = node; 

現在node.next是確定的(也是不必要的,因爲你在構造函數初始化它爲空),但什麼是應該做的下一條指令?它只改變局部變量。您可能的意思是:

ptr.next = node; 
+0

謝謝!我沒有注意到while循環錯誤。 – user2916886

+0

不客氣。如果你沒有任何其他問題,你可以考慮接受這個答案(在downvote按鈕下面有一個東西) – mszymborski