Возможная логическая ошибка при создании пользовательской структуры данных списка

#java #data-structures

#java #структуры данных

Вопрос:

Я пытаюсь создать пользовательскую структуру данных, наиболее похожую на список, для назначения. Я создал класс Node:

  class Node {   
  int data;  
  Node nextNode = null; 

  public Node(int data) {
      this.data=data;  
      }
 }
  

и структура данных класса:

 public class DataStructure {
    private Node previousNode;
    private Node StartingNode;
    private boolean isEmpty = true;

    public void AddNode(int data) {
        if(isEmpty) {
            isEmpty = false;
            StartingNode = new Node(data);
            previousNode = StartingNode;
        }
        else {
            previousNode.nextNode = new Node(data);
            previousNode = previousNode.nextNode;
        }
    }

    private boolean isFirst = true;
    int max = 0;
    public int getMaxData(Node d) {
        if(isFirst) {
            isFirst = false;
            max = d.data;
        }
        else {
            if(d.data > max)
                max = d.data;
            if(d.nextNode != null)
                getMaxData(d.nextNode);
        }
        return max;
    }
}
  

Когда я пытаюсь запустить приведенный выше пример, список создается некорректно (насколько я могу судить). Я думал, что, возможно, это как-то связано со сборкой мусора, но я считаю, что объекты узла все еще активны, поскольку на них ссылается переменная nextNode.

Это основной метод, который запускает пример:

 public static void main(String [] args) {
        DataStructure list = new DataStructure();
        list.AddNode(5);
        list.AddNode(15);
        list.AddNode(12);
        list.AddNode(3);        

        System.out.println(list.getMaxData(list.StartingNode));
    }
  

Ожидаемый результат — число 15, которое будет напечатано, но я получаю только первый узел (5).
Я попробовал «отладку», добавив System.out.writeln (d.data) в начале getMaxData(), и я печатаю только 5, поэтому я считаю, что другие узлы не созданы.

Комментарии:

1. Ну, ваша обработка isFirst или предполагается, что она «помечает» первый вызов getMaxData ?

2. Ну, да, чтобы я мог получить правильный максимум в случае, если значение данных отрицательное.

3. В настоящее время он выполняет только одно: обратите внимание, что это первый вызов getMaxData , а затем возвращает только значение переданного узла и игнорирует все остальное. Вот почему вы получаете 5

Ответ №1:

Эта проблема заключается в следующем:

 if(isFirst) {
    isFirst = false;
    max = d.data;
} else {...}
  

If всегда будет выполняться для первого элемента, а затем вы просто возвращаете это значение. Вы можете сделать это только с помощью предложения else:

 public int getMaxData(Node d) {
    if (d.data > max)
        max = d.data;
    if (d.nextNode != null)
        return getMaxData(d.nextNode);
    return max;
}
  

Комментарии:

1. О, вы правы. Я попытался обойти ошибку «функция должна возвращать int по всем путям» и пропустил это.

2. Вы также должны установить max начальное значение data в конструкторе, чтобы он работал и с отрицательными числами.