@egor_babintsev
Начинающий front-end разработчик

Как работает присвоение tail связанного списка?

Ссыль на песочницу: https://codesandbox.io/s/youthful-noether-2wekf?fi...

Добрый день. Начал учить структуры данных, начал со связанного списка. Возник вопрос по поводу метода append. На 16 и 17 строках происходит непонятное мне присваивание. Зачем нам обновлять свойство next у tail'а, если мы на следующей же строке его перезаписываем? Так еще и почему-то, каким-то волшебным образом, если смотреть через debugger в этот момент newNode присваивается еще и в свойство next, внутри head, которое тут вообще не фигурирует. А если еще и выводить значение this.head в начале метода append, то при первом вызове оно будет null (логично), а уже во втором вызове будет содержать LinkedNodeList в таком же виде, как и на третей итерации (то есть внутри него будет цепочка из 3 вложенных узлов, хотя функция вызвана только второй раз) Как так происходит? Заранее благодарю за объяснение, а то я что-то в шоке
  • Вопрос задан
  • 48 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, гуглер, экс-олимпиадник.
head, tail и next тут - это ссылки не элементы в списке, указатели или как это в typescript называется. Эти переменные не хранят LinkedListNode, а лишь указывают на такой элемент где-то в памяти. Первая операция this.tail.next = newNode; делает последний элемент в списке ссылающимся на новый элемент, который мы добавляем в конец. Просто обновляя ссылку у последнего элемента.
Следующая операция передвигает ссылку tail указывать на новый, только что добавленный, элемент.

В самом начале, когда вы будете добавлять второй элемент head и tail будут указывать на одну и ту же вершину. Поэтому изменение tail.next одновременно меняет и head.next, потому что head и tail - указывают в одно и то же место.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы