2016-08-13 44 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