有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java添加到链表的末尾

我在这个家庭作业问题上遇到了麻烦,它编译正确,但我遇到了一个我无法理解的异常。以下是我的主要方法

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)

所以它的指针变为空似乎有问题。抱歉,如果这是显而易见的,我只做了几个月的编程,链表不是我的强项

如有必要,以下是完整的代码:

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) 个答案

  1. # 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,我们将遍历列表,并将其插入末尾