Решил написать простейший метод - опустошить узел.
public static void Node <Integer> n1 (Node <Integer> n1)
{
while (n1 != null)
n1 = n1.getNext();
}
Обнаружил что узел не изменился. Перенёс цикл в главный метод - работает.
Вопрос таков: почему узел не изменился внутри метода, узел ведь объект? Почему стеки, очереди, массивы и другие объекты изменяются внутри методов void, а узел нет?
UPD: этот метод который изменяет добавляет в узел цепь в конец узла работает.
public static void what (Node <Integer> n1, int a)
{
while (n1.hasNext())
n1 = n1.getNext();
Node <Integer> n7 = new Node <Integer> (a);
n1.setNext(n7);
}
Вы не до конца поняли как это работает.
В метод передается ссылка на объект, пусть это будет ссылка, которая смотрит на объект n1: A -> n1
Когда вы в своем методе выполняете операцию присваивания n1 = n1.getNext(); ваша ссылка будет смотреть на следующий Node, A -> n1.getNext(), при этом сам Node n1 не изменится, а вы хотите изменить именно его.
Вот вам пример:
public void example(){
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
wrongChangeList(list);
System.out.println(list);
correctChangeList(list);
System.out.println(list);
}
private void correctChangeList(List<Integer> list){
list.clear();
list.addAll(Arrays.asList(10, 20, 30));
}
private void wrongChangeList(List<Integer> list){
list = Arrays.asList(10, 20, 30);
}
[1, 2, 3]
[10, 20, 30]
При вызове wrongChangeList ваш внешний список не изменится, изменится лишь ссылка внутри метода wrongChangeList
Во втором случае мы изменяем непосредственно объект.
Надеюсь, вы сможете на основе этого понять, как работает ваш второй метод и почему не работает первый.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости