Связанные списки
Если вы человек, который всегда боится изучать структуры данных и понятия не имеет, с чего начать, не волнуйтесь. Я здесь, чтобы объяснить и начать со связанных списков. Связный список — это линейная структура данных, которая хранит данные в узлах. Узел — это тип объекта, который хранит данные и ссылку на следующий узел.
Узел
Как я уже сказал, связанный список состоит из узлов, поэтому я начну с объяснения того, что такое узел и как создать объект узла в JavaScript. И, проще говоря, содержит только две части: данные и ссылку на следующий узел.
Мы можем создать такой узел в JavaScript
Class Node { constructor(data) { this.data = data; this.next = null; } }
Список
Хорошо, это самая захватывающая часть этой статьи, потому что мы собираемся создать самый важный объект, называемый списком. Да, я сказал возражать! потому что это тоже будет класс. Мы собираемся перечислить все экземпляры нашего объекта узла внутри объекта List.
Итак, вот класс связанного списка.
class LinkedList { constructor() { this.length = 0; this.head = null; this.tail = null; } }
Как видите, в нашем связанном списке есть три основных свойства; длина, голова и хвост. Итак, позвольте мне кратко объяснить каждый из них.
- Длина - это хранение общего количества узлов
- Голова указывает на начало списка (первый узел)
- Хвост указывает на конец списка (последний узел)
Итак, теперь давайте добавим метод push, который добавит узел в конец списка и увеличит длину на 1.
push(data) { const node = new Node(data); if (this.length === 0) { this.head = node; this.tail = node; } else { this.tail.next = node; this.tail = node; } this.length++; }
Прежде всего, мы создаем экземпляр узла для наших данных. И мы проверяем, пуст ли список, чтобы обновить и голову, и хвост, но если список не пуст, мы обновляем только следующее свойство хвостового узла и назначаем узел хвосту, потому что хвост всегда должен сохранять ссылку на последний узел.
Теперь давайте получим все узлы в виде массива, чтобы увидеть, как мы можем зациклиться на нашем связанном списке.
getAll() { let current = this.head; let result = []; while (current) { result.push(current.data); current = current.next; } return result; }
Здесь мы начинаем с головного узла и итерации до последнего узла, и мы собираем его данные в массиве списка, чтобы вернуть его в конце.
Вот весь код.
class Node { constructor(data) { this.data = data; this.next = null; } } class LinkedList { constructor() { this.length = 0; this.head = null; this.tail = null; } push(data) { const node = new Node(data); if (this.length === 0) { this.head = node; this.tail = node; } else { this.tail.next = node; this.tail = node; } this.length++; } getAll() { let current = this.head; let list = []; while (current) { list.push(current.data); current = current.next; } return list; } }
В заключение давайте проверим временную сложность Singly LinkedList.
Заключение
Итак, как видите, связный список эффективно использовать, если нам в основном нужно добавлять данные в наш связанный список, что делает его очень популярным. Но не стоит использовать связанный список, когда нам нужно много читать по индексу, в этом случае Array — лучший вариант.