Если вы пропустили его, воспользуйтесь кодом в первом блоге, который я написал об односвязных списках в JavaScript. Я не буду делать повторений о коде, который у нас есть, поэтому, если вы заблудились, проверьте его!

Теперь мы приступим к реализации некоторых более продвинутых методов в нашем связанном списке. Давайте посмотрим на метод get / 1.

Здесь мы берем желаемый индекс, целое число и проверяем крайние случаи. Мы убеждаемся, что число существует в пределах нашего списка, и если это не так, возвращаем undefined.

Затем мы создаем переменную счетчика и устанавливаем ее в 0. Мы также создаем переменную узла и устанавливаем ее равной заголовку списка. Мы переходим от узла к узлу, используя следующее свойство переменной узла, обновляя переменную узла по мере продвижения. Мы также увеличиваем счетчик при итерации по узлам.

Наконец, когда переменная счетчика равна желаемому индексу, мы возвращаем переменную узла, которая должна быть установлена ​​на желаемый узел. Довольно просто!

Теперь у нас есть / 2.

Мы пользуемся преимуществами нашего недавно созданного метода get и используем его для возврата узла по индексу, который мы хотим обновить. Мы проверяем, что узел был возвращен правильно (что значение индекса находилось в диапазоне значений связанного списка), а затем устанавливаем значение узла на новое значение, которое мы хотим. Мы выходим из блока кода, возвращая true, если операция прошла успешно, и false, если нет.

Последний метод, о котором я расскажу в этом обновлении своих исследований структур данных, - это метод обратного / 0.

Сначала мы определяем переменную узла и устанавливаем ее в заголовок. Мы делаем это, чтобы сохранить значение текущего заголовка списка.

Затем мы устанавливаем значение заголовка списка равным значению его хвоста. Вот где мы теперь можем перевернуть список.

В конце списка устанавливается предыдущее значение заголовка, которое мы сохранили в переменной узла. Итак, теперь, когда наши первое и последнее значения правильно обновлены, мы должны изменить значения между ними.

Мы установили переменную с именем previous равной нулю и следующую переменную, которую мы еще не присвоили. Мы проверяем каждое значение списка и устанавливаем следующую переменную равной следующему свойству переменной узла. При первом проходе переменная узла все еще сохраняет исходное значение заголовка. Поскольку мы продвигаемся от конца списка к началу, свойство next нового хвоста (старая голова) получает значение предыдущего (при первом проходе это должно быть нулевым, так как хвост связанного списка должно иметь следующее свойство, равное нулю).

Наконец, мы меняем значение предыдущего на значение текущего узла и значение узла на значение следующего (которое при первом проходе является вторым элементом в списке).

После завершения каждой итерации мы возвращаем это. В данном случае (ha) относится к самому списку.

В моей следующей установке из этой серии я планирую рассказать о методах вставки и удаления, а также о том, как мы можем использовать базовую структуру связанного списка для реализации более сложных структур данных, таких как стеки и очереди.