添加到链接列表的末尾

时间:2014-04-28 02:18:10

标签: java exception linked-list nodes

我在完成这个家庭作业问题时遇到了麻烦,它编译正确,但我得到了一个我无法弄清楚的异常。这是我的主要方法中的内容

MyLinkedListH1 list = new MyLinkedListH1();

  list.addLast(5);
   list.addLast(6);
   list.addLast(7);

   list.addFirst(1);
  list.addFirst(2);
  list.addFirst(3);

 list.traverse();

  list.print();

addLast方法(在我执行单个addLast之前执行addFirst的主方法中有效,但我不知道这会产生什么影响)。

public void addLast(int d)
{
    Node newNode = new Node();
    newNode.x = d;
    newNode.link = null;

    Node p = first;
    if(first == null)
    {
        first = newNode;
    }
    while (p.link != null)            
  {  
        p = p.link;  
  }
        p.link = newNode;
  }

例外:

 Exception in thread "main" java.lang.NullPointerException
at MyLinkedListH1$Node.access$200(Hmwkal.java:23)
at MyLinkedListH1.addLast(Hmwkal.java:50)
at Hmwkal.main(Hmwkal.java:7)

所以它似乎有一个指针变为null的问题。对不起,如果它显而易见,我只编程了几个月,链接列表不是我的强项。

如有必要,请填写完整的代码:

class Hmwkal
{
    public static void main(String[] args)
    {
       MyLinkedListH1 list = new MyLinkedListH1();

   list.addLast(5);
  list.addLast(6);
  list.addLast(7);

  list.addFirst(1);
  list.addFirst(2);
  list.addFirst(3);

  list.traverse();

  list.print(); 
   }
}

class MyLinkedListH1  
{
    private class Node 
{
      private Node link;
      private int x;
}

   private Node first = null;  

   public void addFirst(int d)
   {
       Node newNode = new Node(); 
       newNode.x = d;            
       newNode.link = first;     
       first = newNode;          
   }

public void addLast(int d)
{
    Node newNode = new Node();
    newNode.x = d;
    newNode.link = null;

    Node p = first;
    if(first == null)
    {
        first = newNode;
    }
    while (p.link != null)            
      {  
        p = p.link;  
      }
        p.link = newNode;
      }
         public void print()
         {
            Node listNode = first;
            while (listNode != null)
         {
            System.out.println(listNode.x);
            listNode = listNode.link;
         }
      }

   public void traverse() //This AND the print might be redundant
   {
       Node p = first;
       while (p != null)
       {
       System.out.println(p.x);
       p = p.link;
       }
    }
}

非常感谢任何帮助^ _ ^

1 个答案:

答案 0 :(得分:1)

您的addLast方法已被破坏;即使我们确定我们开始的节点是null,它仍将继续执行逻辑。

您要做的是拥有一个完整的if-else案例,其中else分支涵盖了遍历列表:

public void addLast(int d) {
    Node newNode = new Node();
    newNode.x = d;
    newNode.link = null;

    if(first == null) {
        first = newNode;
    } else {
        Node p = first;
        while(p.link != null) {
            p = p.link;
        }
        p.link = newNode;
    }
}

这现在有人想要的行为;如果列表中没有节点,并且我们要添加到最后一个元素,我们将添加我们的元素,就像它是最后添加的元素一样。如果head元素不为null,我们将遍历列表,并且将其插入最后。