使用链表Java进行队列ADT

时间:2017-11-26 23:47:14

标签: java data-structures linked-list queue implementation

使用Java,我正在尝试使用循环链表编写队列ADT(我相信我使用了正确的术语,如果我错了,请随时纠正我!)。问题是,当我尝试在front类中调用Queue方法时,它会返回NullPointerException错误。

class Node 
    {
  private Object item;
  private Node next;

  public Node(Object newItem) {
    item = newItem;
    next = null;
  } // end constructor

  public Node(Object newItem, Node nextNode) {
    item = newItem;
    next = nextNode;
  } // end constructor

  public void setItem(Object newItem) {
    item = newItem;
  } // end setItem

  public Object getItem() {
    return item;
  } // end getItem

  public void setNext(Node nextNode) {
    next = nextNode;
  } // end setNext

  public Node getNext() {
    return next;
  } // end getNext

} // end class Node

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class Queue {

    protected Node lastNode;

     Queue(){ 
         lastNode = null; 
    }//End default constructor 

    public boolean isEmpty() { 
        return (lastNode == null); 
    }//End isEmpty

    public void dequeueAll() {
    //Deletes the full queue since the pointer goes nowhere 
        lastNode = null; 
    }

    public void enqueue(Object item) { 
        Node newNode = new Node(item);

        if ( isEmpty() )
            lastNode = newNode; 
        else 
            lastNode.setNext(newNode);

    }
    public void dequeue() { 

        if ( !(isEmpty()) )
            lastNode.setNext(lastNode.getNext().getNext());
        else 
            throw new QueueException("QueueException on dequeue:" + "queue empty");
    }

    public Object front() { 

      if ( !(isEmpty()) ) { 
          Node firstNode = lastNode.getNext();
          return (firstNode.getItem());
      } 
      else { 
          throw new QueueException("QueueException on front:" + "queue empty");

      }
   }    
}

这是我的尝试(正在使用的Node类包含在顶部)。 我相信我的问题在于enqueue方法,因为我认为我没有正确地链接列表。我曾尝试在其他地方寻找类似的想法,但我还没有找到许多我可以在Java中遵循的例子。如果有人能给我一些指示,我会非常感激。谢谢!

1 个答案:

答案 0 :(得分:0)

public boolean isEmpty() { 
        return (lastNode == null); 
    }//End isEmpty

此方法检查lastNode == null。然而,

      Node firstNode = lastNode.getNext();

如果lastNode不为NULL,则lastNode.getNext()可以为NULL。您应该在调用lastNode.getNext()之前检查它。