Теперь, когда мы создали наш связанный список, давайте добавим к нему некоторые функции. Мы собираемся добавить/удалить некоторые данные или узел в начало нашего связанного списка, добавить/удалить узел из хвоста связанного списка и, наконец, выполнить поиск в связанном списке. Это можно сделать, добавив несколько методов в прототип функции-конструктора LinkedList, которую я создал в первой части:

Для нашего первого метода будет добавление узла в заголовок LinkedList. Нам нужно будет создать новый узел, поместить его в начало связанного списка, затем нам нужно правильно связать новый узел с его следующим и предыдущим свойствами. Затем мы убедимся, что указатель head указывает на новый узел, потому что это будет новый узел head.

В строке 1 приведенного выше примера мы добавляем свойство в прототип LinkedList и устанавливаем его равным функции, которая принимает значение.

В строке 2 мы создаем новый узел, и это будет новый узел, который мы добавим в заголовок LinkedList. Параметры, которые мы передаем в этот новый Node. Первым параметром является value, то же самое value, которое мы передаем в функцию-конструктор метода addToHead. Узел также принимает параметр next, который является следующим узлом после newNode, который мы создаем. Поскольку мы хотим, чтобы этот новый узел был новым головным, мы устанавливаем значение newNode равным текущему головному или this.head. Наконец, для параметра prev мы передаем null, потому что это будет новый головной узел, а это означает, что перед ним не будет узлов.

Далее мы хотим прикрепить этот newNode к заголовку LinkedList. Но сначала мы должны рассмотреть, что мы делаем, если наш LinkedList пуст, по сравнению с тем, что мы делаем, если узлы уже присутствуют.

Если LinkedList не пуст, нам нужно правильно подключить newNode к другим узлам, убедившись, что следующийи prevуказатели как для старого, так и для нового головных узлов указывают туда, куда они должны указывать.

В строке 3 мы знаем, что если связанный список не пуст, у него будет заголовок, поэтому, если this.head присутствует или равен true, нам нужно присвоить его prev указатель на newNode, потому что раньше он указывал на null, а теперь this.head стал старым заголовком.

В строках 4 и 5 мы учитываем, является ли связанный список пустым, назначая оба указателя (this.head) и tail (this.tail) элементу . >новый узел.

Обратите внимание, что это не внутри блока if/else, потому что независимо от того, пуст ли связанный список или нет, нам все равно нужно будет назначить newNode в качестве нового заголовка. узел связанного списка.

Ну вот! Теперь мы можем создать наш связанный список и добавить узлы в голову. Чтобы добавить узел в хвост, мы будем использовать ту же логику, за исключением замены tail на head . Посмотрев на два метода рядом друг с другом, вы увидите, насколько они похожи.

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