Значение
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',
}