Есть некая собственная реализация связного списка или что то похожего. Хочу понять как он работает в определенном методе
public class Node<T> {
private T info;
private Node<T> next;
public Node(T x) {
this.info = x;
this.next = null;
}
public Node(T x, Node<T> next) {
this.info = x;
this.next = next;
}
public T getInfo() {
return this.info;
}
public void setInfo(T x) {
this.info = x;
}
public Node<T> getNext() {
return this.next;
}
public void setNext(Node<T> next) {
this.next = next;
}
}
Когда мы заполняем этот список, мы присваиваем ссылке node новое значение в итоге первоначальное должно было потеряться, но когда мы вызываем метод по выводу то все значения выводятся по порядку начиная с первого. Как такое происходит ?
public class Main {
public static void main(String[] args) {
Node<Integer> node = new Node<Integer>(5);
fillNode(node);
nodePrint(node);
}
public static void fillNode(Node<Integer> node) {
for (int i = 0; i < 4; i++) {
node.setNext(new Node<Integer>(i));
node = node.getNext();
}
}
public static void nodePrint(Node < Integer > node){
while (node != null) {
System.out.println(node.getInfo());
node = node.getNext();
}
}
}
Michael
16 уровень
Как работает программа ?
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
9 марта 2021, 21:26полезный
По структурам данных очень много информации на любой вкус.
Это по односвязным списка (Node имеет только next, двусвязные это когда Node имеет ссылки Next и previous)
Вот просмотри
- https://www.youtube.com/watch?v=dLiSslhLYFQ - Основы программирования. Связные списки
- https://javarush.com/quests/lectures/questharvardcs50.level05.lecture05
- https://www.youtube.com/watch?v=-iyi-eDMym0
Это базовые знания, их нужно знать, раньше или позже все-равно с этим столкнешься.
Чтобы это все запомнить, напишешь свои реализации с чистого листа раз 5-10 (с перерывом), тогда запомнишь )
Чтобы потренировать, помимо своей реализации, вот к примеру готовое упражнение с тестами:
Linked list exercise
+1
Anonymous Kirill
9 марта 2021, 21:18
В методе main ты создаешь самый первый узел, в конструктор помещаешь 5.Будет примерно следующая картина.
После ты вызываешь метод fillNode.В нём твоему текущему узлу присваивается ссылка на следующий узел:
После чего переменной node ты присваиваешь значение this.next. (То есть присваиваешь переменной node ссылку на объект, который только что создал) и так весь последующий цикл.
Что касается метода nodePrint() в аргументы ты передаешь ему первоначальный узел. Через метод getNext() он пройдет по всей цепочке т.к у каждого узла (кроме последнего) будет ссылка на следующий.![]()



+1
Michael
10 марта 2021, 06:52
Спасибо, только я не понимаю как в методе fillNode я присваивают ссылке node = node.getNext то бишь я теряю ссылку на head этого списка, а при выводе на экран всё нормально и вывод начинается именно с head. Где то я запутался...
0
Anonymous Kirill
10 марта 2021, 14:42
Когда ты вызываешь метод fillNode() и в параметрах передаешь ссылку node важно помнить ,что в методе будет копия ссылки. В методе main переменная node всегда ссылается на первый узел.
В самом методе fillNode() ты пишешь следующее:
В пункте 1 ты текущему объекту присваиваешь ссылку на новый объект. Теперь
node.next = ссылка на только что созданный объект. Потом(пункт 2) ты присваиваешь переменной node эту же ссылку с помощью вызова метода, возвращающий node.next.В это же время переменная node в методе main() хранит ссылку на самый первый узел. 0