Изменение ссылки без явного изменения ссылки
В прошлом году я изучал Java и довольно хорошо разбирался в структурах данных, но всегда думал о чем-то, чего никогда не понимал. Ниже приведен пример:
public class SList{
private SListNode head;
private int size;
public void insertEnd(Object obj) {
if (head == null) {
head = new SListNode(obj);
} else {
SListNode node = head;
while (node.next != null) {
node = node.next;
}
node.next = new SListNode(obj);
}
size++;
}
Предполагая, что SListNode и конструктор SList уже были реализованы, почему ссылка "head" изменяется и в ее конец добавляется узел, в то время как не было объявления вроде head = node; в самом конце метода? Я знаю, что это, вероятно, очень просто, но я долго искал, и объяснений никогда не было.
1 ответ
SListNode node = head;
В этой строке node
начинает указывать на тот же объект, что и head
является. Поэтому, когда вы делаете что-то с node
Вы меняете сам объект по ссылке. Так что просто имейте в виду, что в Java все указатели, чтобы понять, где вы делаете ошибку.
В общем, я думаю, что вы хотите получить что-то вроде этого (просто начальный пример с основной идеей):
public void insertEnd(Object obj) {
if (head == null) {
head = new SListNode(obj);
} else {
SListNode node = head.next;
if (node != null {
while (true) {
node = node.next;
if (node == null)
break;
}
}
node = new SListNode(obj);
}
size++;
}