Как установить соединение между узлами в связанном списке после вставки
Прежде всего, мне нужно объяснение, а не решение. Как видно из кода, я пытаюсь вставить MovieNode в MovieList. И метод находится в классе MovieList. "список" - это место, где я храню свои MovieNode.
public void insert(Movie movie, int index)
{
MovieNode node = new MovieNode(movie);
MovieNode element;
MovieNode current = list;
while(current.previous != null)
current = current.previous;
element = current; // first node in the list
for(int n = 1; n < index; n++)
element = element.next; // determines where to put new node
node.next = element;
element.previous.next = node;
}
Метод выше, кажется, работает. Однако, когда я изменяю эту строку
element.previous.next = node;
с этим;
element = node;
Там нет изменений в связанном списке после вставки. Мне кажется, что element.previous.next - это то же самое, что и сам элемент, поскольку, когда мы заменяем элемент на узел, мы также меняем преемника узла, который стоит перед элементом в списке. И мы указываем, что преемник нашего нового элемента, который является узлом. Я новичок в этой теме, поэтому я прошу прощения за ошибки, которые я, возможно, сделал.
2 ответа
element
это reference
к MovieNode
, element.previous.next
это еще одна ссылка на то же самое MovieNode
, Разница между этими двумя заключается в том, что element
является временной ссылкой в рамках вашей функции; Тем не менее element.previous.next
это ссылка, проводимая element.previous
узел, который определен вне этой области.
Важно помнить, что в Java говорят a = b
где a
а также b
являются объектами, означает, что a
а также b
ссылаются на тот же объект. Если вы измените a
, b
также изменится.
Вот почему вы скопировали MovieNode
в начале функции: эффективно копировать узел, а не ссылаться на него. Остальные аффекты просто манипулируют previous
а также next
ссылки и не обрабатывают фактические объекты.
Есть разница:
element.previous.next = node;
заставит предыдущий 'элемент следующее поле указывать на узел, т.е. он изменит предыдущий элемент.
element = node;
просто назначит элемент локальной переменной с (новым) узлом - так что он близок к запрету.