En este artículo, implementaremos la estructura de datos LinkedList en Javascript. LinkedList es la estructura de datos dinámica, ya que podemos agregar o eliminar elementos fácilmente, e incluso puede crecer según sea necesario. Al igual que los arreglos, las listas enlazadas almacenan elementos secuencialmente, pero no almacenan los elementos de forma contigua como un arreglo.
Ahora, veamos un ejemplo de un Node de lista enlazada:
Javascript
// User defined class node class Node { // constructor constructor(element) { this.element = element; this.next = null } }
Como en el código anterior, definimos un Node de clase que tiene dos propiedades: elemento y siguiente . Element contiene los datos de un Node mientras que next mantiene el puntero al siguiente Node, que se inicializa con el valor nulo.
Ahora, veamos una implementación de la clase 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 }
El ejemplo anterior muestra una clase de lista enlazada con un constructor y una lista de métodos que se implementarán. La clase Lista enlazada tiene dos propiedades: es decir , cabeza y tamaño , donde la cabeza almacena el primer Node de una Lista y el tamaño indica el número de Nodes en una lista.
Implementemos cada una de estas funciones:
1. add(element) – Agrega un elemento al final de la lista.
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++; }
Para agregar un elemento al final de la lista, consideramos lo siguiente:
- Si la lista está vacía, agregue un elemento y será la cabeza
- Si la lista no está vacía, itere hasta el final de la lista y agregue un elemento al final de la lista.
2. insertAt(elemento, índice) – Inserta un elemento en el índice dado en una lista.
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++; } }
Para agregar un elemento en el índice dado de la lista, consideramos tres condiciones de la siguiente manera:
- si el índice es cero, agregamos un elemento al principio de la lista y lo hacemos encabezar
- Si el índice es la última posición de la lista, agregamos el elemento al final de la lista
- si el índice está entre 0 o tamaño – 1 iteramos sobre el índice y agregamos un elemento en ese índice
3. removeFrom(index) – Elimina y devuelve un elemento de la lista del índice especificado
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; } }
Para eliminar un elemento de la lista consideramos tres condiciones:
- Si el índice es 0, eliminamos la cabeza y hacemos que el siguiente Node sea la cabeza de la lista
- si el índice es tamaño – 1, entonces eliminamos el último elemento de la lista y hacemos anterior el último elemento
- si está entre 0 y tamaño – 1, eliminamos el elemento usando prev y el Node actual
4. removeElement(elemento) – Este método elimina el elemento de la lista. Devuelve el elemento eliminado, o si no se encuentra devuelve -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; }
El método anterior es solo una modificación de removeFrom(index) , ya que busca un elemento y lo elimina, en lugar de eliminarlo de una ubicación específica
Métodos auxiliares
Declaremos algunos métodos auxiliares que son útiles al trabajar con LinkedList.
1. indexOf(element) – devuelve el índice de un elemento dado si el elemento está en la lista.
Javascript
// finds the index of element indexOf(element) { var count = 0; var current = this.head; // iterate over the list while (current != null) { // compare each element of the list // with given element if (current.element === element) return count; count++; current = current.next; } // not found return -1; }
En este método, iteramos sobre la lista para encontrar el índice de un elemento. Si no está presente en la lista, devuelve -1 en su lugar.
2. isEmpty() : devuelve verdadero si la lista está vacía.
Javascript
// checks the list for empty isEmpty() { return this.size == 0; }
En este método, verificamos la propiedad de tamaño de la clase LinkedList y, si es cero, la lista está vacía.
3. size_of_list() – Devuelve el tamaño de la lista
Javascript
// gives the size of the list size_of_list() { console.log(this.size); }
3. printList() – Imprime el contenido de la lista.
Javascript
// prints the list items printList() { var curr = this.head; var str = ""; while (curr) { str += curr.element + " "; curr = curr.next; } console.log(str); }
En este método, iteramos sobre la lista completa y concatenamos los elementos de cada Node y lo imprimimos.
Nota: Se pueden declarar diferentes métodos auxiliares en la clase LinkedList según sea necesario.
Implementación
Ahora, usemos la clase LinkedList y sus diferentes métodos descritos anteriormente.
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();
Código completo:
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; // iterate over the list while (current != null) { // compare each element of the list // with given element if (current.element === element) return count; 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 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();
Producción:
true 10 1 undefined 10 20 30 40 50 is element removed ?50 10 20 30 40 Index of 40 3 10 20 60 30 40 is List Empty ? false 30 10 20 60 40
JavaScript es mejor conocido por el desarrollo de páginas web, pero también se usa en una variedad de entornos que no son de navegador. Puede aprender JavaScript desde cero siguiendo este tutorial de JavaScript y ejemplos de JavaScript .
Este artículo es una contribución de Sumit Ghosh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA