Как установить соединение между узлами в связанном списке после вставки

Прежде всего, мне нужно объяснение, а не решение. Как видно из кода, я пытаюсь вставить 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;

просто назначит элемент локальной переменной с (новым) узлом - так что он близок к запрету.

Другие вопросы по тегам