данные первого узла в LinkedList не распознаются при вызове - PullRequest
1 голос
/ 23 марта 2019

Я создал структуру данных стека с нуля, используя связанный список. Кажется, push() правильно, потому что я могу использовать метод отображения, используя first.data, и он отображает список. Но когда я использую peek(), я получаю NoSuchElementException, потому что есть оператор 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 голосов
/ 23 марта 2019

В своем коде вы заметите, что вы получаете ошибку только при вызове метода 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. Вы пытаетесь implement Stack класс, но на самом деле вы должны extend it.
  2. Для использования isEmpty() из класса Stack вам нужно увеличить elementCount++; в методе push() вместо size.Так как isEmpty() проверяет elementCount, унаследованное от класса Stack.
  3. Тип возврата push не должен быть void, вместо этого он должен возвращать аргумент.(согласно Java doc класса Stack).

    @Override
    public Object push(Object newElement) {
         first = new Node(newElement, first);
         elementCount++;
         return newElement;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...