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

Введение

Предпосылки

Реализация

Сценарии использования

Введение

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

хорошо, Википедия дает хорошее объяснение LinkedList, но как он выглядит

Описание изображения

Изображение дало представление о том, что LinkedList визуально

Предпосылки

Реализация
Ждать…

Описание изображения

Привет, прежде чем мы начнем, я хочу пожелать всем хорошей пятницы и выходных

Теперь это

Описание изображения

Описание изображения

Давайте сломаем это

class Node {
  constructor(elements, next = null) {
    this.elements = elements;
    this.next = next;
  }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

class LinkedList {
  constructor() {
    this.head = null;
    this.size = 0;
  }

}
Войти в полноэкранный режим

Выйти из полноэкранного режима

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

Методы

  • InsertH: вставка элемента в начало списка.

  • add: добавление элемента в конец списка.

  • вставка: добавление любого элемента по индексу.

  • deleteL: удаление элемента в конце.

  • removeFrom: удалить любой элемент из индекса.

  • indexOf: получение индекса любого элемента.

  • print: мы печатаем LinkedList.

insertH(elements) {
    const node = new Node(elements, this.head);

    this.head = node;

    this.size++;
    return node;
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Эта функция выполняет основные действия: сначала у нее есть параметр, а затем в функции мы инициализируем класс Node. Запомни магазин и сейчас мы меняемся this.head Узел головы хранит узел, а левый являются первичными.

add(elements) {
    let node = new Node(elements);

    let current;
    if (this.head === null) {
      this.head = node;
    } else {
      current = this.head;

      while (current.next) {
        current = current.next;
      }

      current.next = node;
    }
    this.size++;
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Теперь мы добавляем в последний список, мы проверяем, если this.head нулевой, если так this.head устанавливается на узел.
если это не мы идем и создаем current= this.head to access the properties of the node после того, как мы перебираем список в конце, если мы доберемся до него сейчас current.next = node; другие являются основными.

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

   indexOf(elements) {
    let current = this.head;
    let it = 0;
    while (current != null) {
      if (current.elements === elements) {
        console.log('elements', current.elements);
        return it;
      }

      it++;
      current = current.next;
    }
    return null;
  }
  print() {
    let current = this.head;

    let str="";
    while (current) {
      str += current.elements + '-->';

      current = current.next;
    }

    return console.log(str);
  }

  get length() {
    return console.log(this.size);
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Мы ищем, что так много методов, но они просто то, что выглядит сложно, это indexOf что я собираюсь объяснить

 indexOf(elements) {
    let current = this.head;
    let it = 0;
    while (current != null) {
      if (current.elements === elements) {
        console.log('elements', current.elements);
        return it;
      }

      it++;
      current = current.next;
    }
    return null;
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Здесь мы пытаемся получить indexOf любого элемента, теперь сначала для текущего установлено значение this.head затем мы создаем цикл while, в котором сначала мы проверяем, не равен ли ток нулю, а затем вне цикла мы увеличиваем it а затем установите ток на current.next то если не элемент не найден мы return null.

  insert(elements, index) {
    if (index < 0 || index > this.size) return -1;
    else {
      let node = new Node(elements);

      let current, prev, it;

      current = this.head;
      it = 0;
      if (index === 0) {
        this.insertH(elements);
      } else {
        while (it < index) {
          it++;
          prev = current;
          current = current.next;
        }
        node.next = current;
        prev.next = node;
      }
      this.size++;
    }
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Итак, первое, что нужно увидеть, это то, что мы создаем два параметра, первый параметр получает данные, а второй проверяет, доступен ли индекс, а затем в функции if (index < 0 || index > this.size) return -1; проверяет, меньше ли индекс 0 или индекс больше размера, тогда мы возвращаем -1, что означает, что он равен нулю. В операторе else мы инициализируем class Node создал три переменные, затем установил текущую на this.headпосле чего устанавливаем it поскольку мы собираемся использовать его для вставки элементов, теперь мы видим, равен ли индекс нулю, если да, то мы вставляем его в начало. если нет, мы зацикливаем список до тех пор, пока it меньше чем index затем мы устанавливаем prev к current а потом current к current.next затем вне цикла

// remove the element
 node.next = current;
 prev.next = node;
Войти в полноэкранный режим

Выйти из полноэкранного режима

removeFrom(index) {
    if (index < 0 || index >= this.size) return -1;
    else {
      let current, prev, it;
      it = 0;
      current = this.head;
      prev = current;
      if (index === 0) {
        this.head = current.next;
      } else {
        while (it < 0) {
          it++;
          prev = current;
          current = current.next;
        }
        prev.next = current.next;
      }
      this.size--;

      return current.elements;
    }
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Удаление элемента в списке по индексу очень просто, как показано в приведенном выше коде. Во-первых, мы проверяем, меньше ли индекс нуля или больше нуля, если да, то мы return -1 значит это null следующий код прост, но после проверки w, если индекс равен нулю, мы удаляем голову в операторе else, который мы повторяем до тех пор, пока itменьше нуля, тогда мы увеличиваем его после того, как в приведенном ниже коде мы установили prev к current а потом current к current.next после этого довольно простой самоочевидный

 prev = current;
 current = current.next;
Войти в полноэкранный режим

Выйти из полноэкранного режима

  deleteL(elements) {
    let current = this.head;

    let prev = null;
    while (current != null) {
      if (current.elements === elements) {
        if (prev === null) {
          this.head = current.next;
        } else {
          prev.next = current.next;
        }
        this.size--;
        return current.elements;
      }
      prev = current;
      current = current.next;
    }

    return -1;
  }
Войти в полноэкранный режим

Выйти из полноэкранного режима

Что ж, удалить довольно легко, как мы увидим, во-первых, мы создаем переменную с именем current, как мы делали во многих наших кодах. Я полагаю, вы уже знакомы с ним, обратите внимание, что prev имеет значение null, теперь мы перебираем список, пока он не равен нулю, затем мы проверяем, если current.next равно elements данные, которые мы вставили. Затем внутри оператора if у нас есть еще один оператор, который проверяет, prev равно null мы удаляем элемент, и в операторе else то же самое мы уменьшаем size а левый основной.

let node = new LinkedList();

node.insertH(1);
node.add(2);

node.add(4);

node.add(5);
node.insert(47, 0);

node.deleteL(1);
console.log(node.indexOf(47));
node.removeFrom(0);

node.length

node.print();
Войти в полноэкранный режим

Выйти из полноэкранного режима

Выход терминала

Описание изображения

Полный код.

class Node {
  constructor(elements, next = null) {
    this.elements = elements;
    this.next = next;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
    this.size = 0;
  }

  insertH(elements) {
    const node = new Node(elements, this.head);

    this.head = node;

    this.size++;
    return node;
  }

  add(elements) {
    let node = new Node(elements);

    let current;
    if (this.head === null) {
      this.head = node;
    } else {
      current = this.head;

      while (current.next) {
        current = current.next;
      }

      current.next = node;
    }
    this.size++;
  }
  insert(elements, index) {
    if (index < 0 || index > this.size) return -1;
    else {
      let node = new Node(elements);

      let current, prev, it;

      current = this.head;
      it = 0;
      if (index === 0) {
        this.insertH(elements);
      } else {
        while (it < index) {
          it++;
          prev = current;
          current = current.next;
        }
        node.next = current;
        prev.next = node;
      }
      this.size++;
    }
  }

  removeFrom(index) {
    if (index < 0 || index >= this.size) return -1;
    else {
      let current, prev, it;
      it = 0;
      current = this.head;
      prev = current;
      if (index === 0) {
        this.head = current.next;
      } else {
        while (it < 0) {
          it++;
          prev = current;
          current = current.next;
        }
        prev.next = current.next;
      }
      this.size--;

      return current.elements;
    }
  }

  deleteL(elements) {
    let current = this.head;

    let prev = null;
    while (current != null) {
      if (current.elements === elements) {
        if (prev === null) {
          this.head = current.next;
        } else {
          prev.next = current.next;
        }
        this.size--;
        return current.elements;
      }
      prev = current;
      current = current.next;
    }

    return -1;
  }

  indexOf(elements) {
    let current = this.head;
    let it = 0;
    while (current != null) {
      if (current.elements === elements) {
        console.log('elements', current.elements);
        return it;
      }

      it++;
      current = current.next;
    }
    return null;
  }
  print() {
    let current = this.head;

    let str="";
    while (current) {
      str += current.elements + '-->';

      current = current.next;
    }

    return console.log(str);
  }

  get length() {
    return console.log(this.size);
  }
}

let node = new LinkedList();

node.insertH(1);
node.add(2);

node.add(4);

node.add(5);
node.insert(47, 0);

node.deleteL(1);
console.log(node.indexOf(47));
node.removeFrom(0);

node.length

node.print();

Войти в полноэкранный режим

Выйти из полноэкранного режима