Реализация LinkedList в Javascript
В этой статье мы реализуем структуру данных LinkedList в Javascript. LinkedList - это динамическая структура данных, так как мы можем легко добавлять или удалять элементы, и она может даже увеличиваться по мере необходимости. Как и массивы, связанные списки хранят элементы последовательно, но не хранят элементы непрерывно, как массив.
Теперь давайте посмотрим на пример узла связанного списка:
Javascript
// User defined class node class Node { // constructor constructor(element) { this .element = element; this .next = null } } |
Как и в приведенном выше коде, мы определяем класс Node, имеющий два свойства: element и next . Элемент содержит данные узла, а следующий содержит указатель на следующий узел, который инициализируется нулевым значением.
Теперь давайте посмотрим на реализацию класса Linked List:
Javascript
// linkedlist class class LinkedList { constructor() { this .head = null ; this .size = 0; } // functions to be implemented // add(element) // insertAt(element, location) // removeFrom(location) // removeElement(element) // Helper Methods // isEmpty // size_Of_List // PrintList } |
В приведенном выше примере показан класс связанного списка с конструктором и списком реализуемых методов. Класс связанного списка имеет два свойства: то есть заголовок и размер , где заголовок хранит первый узел списка, а размер указывает количество узлов в списке.
Реализуем каждую из этих функций:
1. add (element) - добавляет элемент в конец списка.
Javascript
// adds an element at the end // of list add(element) { // creates a new node var node = new Node(element); // to store current node var current; // if list is Empty add the // element and make it head if ( this .head == null ) this .head = node; else { current = this .head; // iterate to the end of the // list while (current.next) { current = current.next; } // add node current.next = node; } this .size++; } |
Чтобы добавить элемент в конец списка, мы учитываем следующее:
- Если список пуст, добавьте элемент, и он будет заголовком
- Если список не пуст, выполните итерацию до конца списка и добавьте элемент в конец списка.
2. insertAt (element, index) - вставляет элемент по указанному индексу в список.
Javascript
// insert element at the position index // of the list insertAt(element, index) { if (index < 0 || index > this .size) return console.log( "Please enter a valid index." ); else { // creates a new node var node = new Node(element); var curr, prev; curr = this .head; // add the element to the // first index if (index == 0) { node.next = this .head; this .head = node; } else { curr = this .head; var it = 0; // iterate over the list to find // the position to insert while (it < index) { it++; prev = curr; curr = curr.next; } // adding an element node.next = curr; prev.next = node; } this .size++; } } |
Чтобы добавить элемент в конец списка, мы учитываем три следующих условия:
- если индекс равен нулю, мы добавляем элемент в начало списка и делаем его заголовком
- Если индекс является последней позицией списка, мы добавляем элемент в конец списка
- если индекс находится между 0 или размером - 1, мы переходим к индексу и добавляем элемент по этому индексу
3. removeFrom (index) - удаляет и возвращает элемент из списка по указанному индексу.
Javascript
// removes an element from the // specified location removeFrom(index) { if (index < 0 || index >= this .size) return console.log( "Please Enter a valid index" ); else { var curr, prev, it = 0; curr = this .head; prev = curr; // deleting first element if (index === 0) { this .head = curr.next; } else { // iterate over the list to the // position to removce an element while (it < index) { it++; prev = curr; curr = curr.next; } // remove the element prev.next = curr.next; } this .size--; // return the remove element return curr.element; } } |
Чтобы удалить элемент из списка, мы учитываем три условия:
- Если индекс равен 0, мы удаляем заголовок и делаем следующий узел заголовком списка.
- если индекс равен size - 1, то мы удаляем последний элемент из списка и делаем последний элемент prev
- если он находится в диапазоне от 0 до size - 1, мы удаляем элемент, используя prev и текущий узел
4. removeElement (element) - этот метод удаляет элемент из списка. Он возвращает удаленный элемент или, если он не найден, возвращает -1.
Javascript
// removes a given element from the // list removeElement(element) { var current = this .head; var prev = null ; // iterate over the list while (current != null ) { // comparing element with current // element if found then remove the // and return true if (current.element === element) { if (prev == null ) { this .head = current.next; } else { prev.next = current.next; } this .size--; return current.element; } prev = current; current = current.next; } return -1; } |
Вышеупомянутый метод - это просто модификация removeFrom (index) , поскольку он ищет элемент и удаляет его, а не удаляет его из указанного места.
Вспомогательные методы
Объявим несколько вспомогательных методов, которые пригодятся при работе с LinkedList.
1. indexOf (element) - возвращает индекс данного элемента, если элемент находится в списке.
Javascript
// finds the index of element indexOf(element) { var count = 0; var current = this .head; // iterae over the list while (current != null ) { // compare each element of the list // with given element if (current.element === element) count; return count++; current = current.next; } // not found return -1; } |
В этом методе мы перебираем список, чтобы найти индекс элемента. Если его нет в списке, вместо этого возвращается -1.
2. isEmpty () - возвращает истину, если список пуст.
Javascript
// checks the list for empty isEmpty() { return this .size == 0; } |
В этом методе мы проверяем свойство размера класса LinkedList , и если оно равно нулю, то список пуст.
3. size_of_list () - возвращает размер списка
Javascript
// gives the size of the list size_of_list() { console.log( this .size); } |
3. printList () - печатает содержимое списка.
Javascript
// prints the list items printList() { var curr = this .head; var str = "" ; while (curr) { str += curr.element + " " ; curr = curr.next; } console.log(str); } |
В этом методе мы перебираем весь список, объединяем элементы каждого узла и печатаем его.
Примечание. При необходимости в классе LinkedList могут быть объявлены различные вспомогательные методы.
Реализация
Теперь давайте воспользуемся классом LinkedList и его различными методами, описанными выше.
Javascript
// creating an object for the // Linkedlist class var ll = new LinkedList(); // testing isEmpty on an empty list // returns true console.log(ll.isEmpty()); // adding element to the list ll.add(10); // prints 10 ll.printList(); // returns 1 console.log(ll.size_of_list()); // adding more elements to the list ll.add(20); ll.add(30); ll.add(40); ll.add(50); // returns 10 20 30 40 50 ll.printList(); // prints 50 from the list console.log( "is element removed ?" + ll.removeElement(50)); // prints 10 20 30 40 ll.printList(); // returns 3 console.log( "Index of 40 " + ll.indexOf(40)); // insert 60 at second position // ll contains 10 20 60 30 40 ll.insertAt(60, 2); ll.printList(); // returns false console.log( "is List Empty ? " + ll.isEmpty()); // remove 3rd element from the list console.log(ll.removeFrom(3)); // prints 10 20 60 40 ll.printList(); |
Полный код:
Javascript
class Node { // constructor constructor(element) { this .element = element; this .next = null } } // linkedlist class class LinkedList { constructor() { this .head = null ; this .size = 0; } // adds an element at the end // of list add(element) { // creates a new node var node = new Node(element); // to store current node var current; // if list is Empty add the // element and make it head if ( this .head == null ) this .head = node; else { current = this .head; // iterate to the end of the // list while (current.next) { current = current.next; } // add node current.next = node; } this .size++; } // insert element at the position index // of the list insertAt(element, index) { if (index < 0 || index > this .size) return console.log( "Please enter a valid index." ); else { // creates a new node var node = new Node(element); var curr, prev; curr = this .head; // add the element to the // first index if (index == 0) { node.next = this .head; this .head = node; } else { curr = this .head; var it = 0; // iterate over the list to find // the position to insert while (it < index) { it++; prev = curr; curr = curr.next; } // adding an element node.next = curr; prev.next = node; } this .size++; } } // removes an element from the // specified location removeFrom(index) { if (index < 0 || index >= this .size) return console.log( "Please Enter a valid index" ); else { var curr, prev, it = 0; curr = this .head; prev = curr; // deleting first element if (index === 0) { this .head = curr.next; } else { // iterate over the list to the // position to removce an element while (it < index) { it++; prev = curr; curr = curr.next; } // remove the element prev.next = curr.next; } this .size--; // return the remove element return curr.element; } } // removes a given element from the // list removeElement(element) { var current = this .head; var prev = null ; // iterate over the list while (current != null ) { // comparing element with current // element if found then remove the // and return true if (current.element === element) { if (prev == null ) { this .head = current.next; } else { prev.next = current.next; } this .size--; return current.element; } prev = current; current = current.next; } return -1; } // finds the index of element indexOf(element) { var count = 0; var current = this .head; // iterae over the list while (current != null ) { // compare each element of the list // with given element if (current.element === element) count; return count++; current = current.next; } // not found return -1; } // checks the list for empty isEmpty() { return this .size == 0; } // gives the size of the list size_of_list() { console.log( this .size); } // prints the list items printList() { var curr = this .head; var str = "" ; while (curr) { str += curr.element + " " ; curr = curr.next; } console.log(str); } } // creating an object for the // Linkedlist class var ll = new LinkedLis
РЕКОМЕНДУЕМЫЕ СТАТЬИ |