调用时无法识别LinkedList中的第一个节点数据

时间:2019-03-23 07:16:47

标签: java stack

我使用链表从头开始创建了堆栈数据结构。 push()似乎是正确的,因为我可以通过first.data使用显示方法,并且显示列表。但是当我使用peek()时会得到NoSuchElementException,因为有一个if语句if (first == null),但第一个不应为null

我不确定该如何解决。

public class StackNew implements Stack{ //Stack is an interface given by my professor

private int size;

 private class Node {
        public Object data;
        public Node next;
        public Node(Object data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

private Node first = null;

public void push(Object newElement) {
    first = new Node(newElement, first);
    size++;

}
public Object peek(){
    if (first == null) {
       throw new NoSuchElementException();
     }
 return first.data;
}
public void display() {
    Node previous = null;
    while(first != null) {
        System.out.println((first.data));
        previous = first;
        first = first.next;
    }
}
public static void main(String args[]) {
    StackNew stack = new StackNew();
    stack.push("java");
    stack.push(1);
    stack.push("code");

    stack.display();
    System.out.println(stack.isEmpty());
    stack.peek();

}

当我尝试使用peek()方法时,当第一个节点应包含“代码”时,该节点为null。

1 个答案:

答案 0 :(得分:0)

在您的代码中,您会注意到只有调用display方法时才会出现错误。

这是因为在您的实现中,您将first覆盖为first.next,最终在while循环的最后一次迭代中为空。因此,您需要一个新的指针,该指针可以跟踪当前元素,并且可以前进到下一个元素,而不会影响first指针。

因此,您需要将display方法更正为:

 public void display() {
      Node current = first;
      while(current != null) {
          System.out.println((current.data));
          current = current.next;
      }
 }

在这里,新的指针current将跟踪当前元素,并且在while循环中将连续打印这些元素。

您的代码中还有其他一些问题(如果您尝试扩展java.util.Stack):

  1. 您正在尝试implementStack,但实际上您应该extend它。
  2. 为了使用isEmpty()类中的Stack,您需要使用elementCount++;方法而不是push()来增加size。当isEmpty()检查elementCount继承自Stack类时。
  3. push的返回类型不应为void,而应返回参数。 (根据Stack类的Java doc)。

    @Override
    public Object push(Object newElement) {
         first = new Node(newElement, first);
         elementCount++;
         return newElement;
    }