Вставка узла в двойной связанный список - PullRequest
3 голосов
/ 13 октября 2010

У меня проблемы с пониманием второй половины соединения нового узла в двойной связанный список.Я пишу метод add, который принимает узел, после которого новый узел должен быть вставлен.Моя трудная область заключается в понимании того, как создать ссылку на следующий узел после того, как ссылки на предыдущий узел были перенаправлены на новый узел.

Итак, вот где я пришел к

Chunk<E> newChunk= new Chunk<E>();

    newChunk.next= prevChunk.next;
    prevChunk.next= newChunk;

    newChunk.prev= newChunk.next.prev;
    newChunk.next.prev= newChunk;

Насколько я понимаю, команда newChunk.next= prevChunk.next копирует адрес памяти в prevChunk.next и устанавливает это значение в newChunk.next, а затем prevChunk.next сбрасывается для ссылки на newChunk.

Таким образом, так как prevChunk является единственным узлом, на который имеется ссылка, который уже находится в списке, и следующие поля были перенаправлены в newChunkя на правильном пути в использовании этих ссылок для ссылки на следующий узел?

Ответы [ 3 ]

3 голосов
/ 13 октября 2010

Вы правы, но на заметку о том, что большинство двойных связанных списков не являются круглыми, так как следующий из lastNode не является firstNode (то же самое, что prevNowNode не является lastNode). Если «prevChunk» был последним узлом в двойном связанном списке, и вы добавляете newChunk после prevChunk как последний элемент в связанном списке,

NewChunk.prev= newChunk.next.prev;

по существу устанавливает предыдущий элемент NewChunk равным предыдущему элементу null, что, вероятно, не то, что вы собираетесь

Возможно, вы захотите проверить, является ли previous.next изначально нулевым.

0 голосов
/ 13 октября 2010

То, что у вас там, правильно. Тем не менее, это немного трудно понять (таким образом, ваш вопрос). Вот более интуитивное решение, которое должно работать и быть более понятным для вас:

Chunk<E> newChunk = new Chunk<E>();
Chunk<E> nextChunk = prevChunk.next;

prevChunk.next = newChunk;
newChunk.prev = prevChunk;

nextChunk.prev = newChunk;
newChunk.next = nextChunk;

Я создаю новую ссылку на следующий узел в связанном списке. Это может быть так же эффективно, как и последний ответ, поскольку оно создает новую ссылку, но должно помочь вам понять решение.

0 голосов
/ 13 октября 2010

Как-то так должно работать.

Chunk<E> newChunk= new Chunk<E>();

    newChunk.next = prevChunk.next;
    newChunk.prev = prevChunk;
    prevChunk.next = newChunk;
    newChunk.next.prev = newChunk;
...