@Paramount1987

Односвязные список — добавление нового узла?

Всем привет. Вопрос следующий - как работает метод "append" в данной реализации?

link

При первом вызове - в head и tail хранится объект по ссылке.
При втором вызове меняем свойство next для объекта tail (в head свойство next меняется тоже, т.к. это один и тот же объект) и далее мы перезаписываем tail - теперь он ссылается на другой объект.

Но при третьем и далее вызовах - строчка 45 ( this.tail.next = newNode) меняет значение и у head - происходит дальнейшее добавление узла. Хотя мы переписали значение по ссылке у tail (и свойство next в консоли выдает null при добавлении нового узла)
Объясните, пожалуйста этот момент.
  • Вопрос задан
  • 217 просмотров
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Значение head вы меняете только кода список пуст. Вы должны понимать чем принципиально отличаются вызовы в строках 45 и 46:
this.tail.next = newNode;
Эта строка добавляет ссылку на новую ноду в свойство next последней ноды, на которую помимо свойства next предпоследней ссылается еще и свойство tail самого списка. Далее:
this.tail = newNode;
Наша новая нода пишется в свойство tail.
Само свойство next новой ноды ни на что пока не ссылается. Но при следующем вызове append, в строке 45 туда запишется(оно будет ссылаться) новая нода.

Предположим сейчас в списке такой tail:
{
  next: null,
  value: 'xxx',
}

Вызываем append:
list.append('yyy');
tail после выполнения строки 45:
{
  next: {
    next: null,
    value: 'yyy',
  },
  value: 'xxx',
}

tail после выполнения строки 46:
{
  next: null,
  value: 'yyy',
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы