#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
в конструкторе, чтобы он работал и с отрицательными числами.