Clase de nodo
class ListNode {
constructor(data) {
this.data = data
this.next = null
}
}
Clase de lista vinculada
class LinkedList {
constructor(head = null) {
this.head = head
}
}
Crear lista vinculada
let node1 = new ListNode(2)
let node2 = new ListNode(5)
node1.next = node2
let list = new LinkedList(node1)
console.log(list.head.next.data) //returns 5
size() {
let count = 0;
let node = this.head;
while (node) {
count++;
node = node.next
}
return count;
}
const ListFunctions = {
display: (linkedList) => {
items = [];
if (linkedList.head === null) {
return "The list is empty";
} else {
let currNode = linkedList.head;
while (currNode.next !== null) {
items.push(currNode.data);
currNode = currNode.next;
}
items.push(currNode.data);
}
return `Linked List Items: ${items.join("->")}`;
}
isEmpty: (linkedList) => {
if (linkedList.head === null) {
return `This list is empty`;
}
return `There are items in this list`;
}
find(item) {
let currNode = this.head;
if (!this.head) {
return null;
}
while (currNode.data !== item) {
if (currNode.next === null) {
return null;
} else {
currNode = currNode.next;
}
}
return currNode;
}
}
clear() {
this.head = null;
}
remove(item) {
if (!this.head) {
return null;
}
if (this.head.data === item) {
this.head = this.head.next;
return;
}
let currNode = this.head;
let previousNode = this.head;
while (currNode !== null && currNode.data !== item) {
previousNode = currNode;
currNode = currNode.next;
}
if (currNode === null) {
return;
}
previousNode.next = currNode.next;
}
insertFirst(item) {
this.head = new _Node(item, this.head);
}
insertLast(item) {
if (this.head === null) {
this.insertFirst(item);
} else {
let tempNode = this.head;
while (tempNode.next !== null) {
tempNode = tempNode.next;
}
tempNode.next = new _Node(item, null);
}
}
insertBefore(item, key) {
if (!this.head) {
return;
}
if (this.head.data === key) {
this.insertFirst(item);
return;
}
let currNode = this.head;
let previousNode = this.head;
while (currNode !== null && currNode.data !== key) {
previousNode = currNode;
currNode = currNode.next;
}
if (currNode === null) {
console.log(`key value not found`);
return;
}
previousNode.next = new _Node(item, currNode);
}
insertAfter(item, key) {
if (!this.head) {
return;
}
if (this.head.data === key) {
this.insertFirst(item);
return;
}
let currNode = this.head;
let nextNode = this.head;
while (currNode !== null && currNode.data !== key) {
currNode = nextNode;
nextNode = nextNode.next;
}
if (currNode === null) {
console.log(`key value not found`);
return;
}
currNode.next = new _Node(item, nextNode);
}
getLast() {
let lastNode = this.head;
if (lastNode) {
while (lastNode.next) {
lastNode = lastNode.next
}
}
return lastNode
}
getFirst() {
return this.head;
}
findPrevious: (linkedList, key) => {
if (linkedList.head === null) {
return null;
}
let prevNode;
let currNode = linkedList.head;
while (currNode.data !== key) {
prevNode = currNode;
currNode = currNode.next;
}
return `The previous node is ${prevNode.data}`;
}
En estos ejercicios, practicará la creación de una lista vinculada, implementando su núcleo y algunas operaciones complementarias. También usará su lista vinculada para resolver preguntas de entrevistas. No olvide evaluar la gran O para cada uno de estos ejercicios. Inicie cada problema indicando 1 o más entradas y salidas de muestra.
Escriba una clase de lista vinculada y estas funciones centrales (InsertFirst, InsertLast, Eliminar, buscar) desde cero.
Implemente las siguientes funciones que operan en su clase de lista vinculada. Tenga en cuenta que estas deberían ser funciones gratuitas en lugar de los métodos de la clase de lista vinculada, por lo que impleméntelos fuera de la clase de lista vinculada. Pruebe cada función utilizando la lista creada en el Ejercicio 1.
Analice la siguiente función (sin ejecutarla en un IDE) para determinar qué problema está tratando de resolver. ¿Cuál es la complejidad del tiempo de este algoritmo?
function WhatDoesThisProgramDo(lst) {
let current = lst.head;
while (current !== null) {
let newNode = current;
while (newNode.next !== null) {
if (newNode.next.value === current.value) {
newNode.next = newNode.next.next;
}
else {
newNode = newNode.next;
}
}
current = current.next;
}
}
Escriba un algoritmo para revertir una lista vinculada. La complejidad del tiempo de su algoritmo debe ser lineal (o (n)). Para este ejercicio, observe que no le pedimos que solo imprima la lista vinculada en reversa o use otra lista vinculada para almacenar el valor en orden inverso. Su programa debe revertir la dirección de una lista vinculada individual determinada. En otras palabras, todos los punteros deben señalar hacia atrás. Bonificación: resuelva este problema usando algoritmos recursivos e iterativos.
Escriba un algoritmo para encontrar el tercer elemento desde el final de una lista vinculada. Nota Puede que tenga la tentación de agregar una propiedad de longitud a su clase de lista vinculada. La propiedad de longitud no es una propiedad típica de la lista vinculada, por lo tanto, no realice ninguna modificación en la clase de lista vinculada que se le proporcione.
Escriba un algoritmo para encontrar el elemento medio de una lista vinculada. Nota Puede que tenga la tentación de agregar una propiedad de longitud a su clase de lista vinculada. La propiedad de longitud no es una propiedad típica de la lista vinculada, por lo tanto, no realice ninguna modificación en la clase de lista vinculada que se le proporcione. Además, encontrar el tamaño de la lista vinculada utilizando la función size () y dividirla a la mitad no encontrará el medio correcto de la lista vinculada. Entonces, no use ninguno de estos enfoques.
Escriba un algoritmo para encontrar si una lista vinculada tiene un ciclo (es decir, si un nodo en la lista tiene su siguiente valor apuntando a un nodo anterior en la lista). Para este ejercicio, cree una lista vinculada con el nombre Cyclelist. Asegúrese de insertar nodos en la lista para que tenga un ciclo. Luego pruebe su programa con una función de ciclista.
Implementar una lista doblemente vinculada. Las funciones principales de la lista doblemente vinculada se insertarían (primero, por último, antes, después y en), eliminar y encontrar. Escriba una función maindll, y dentro de ella crea la lista doblemente vinculada DLL y agregue los siguientes elementos: Acuaria, Caprica, Gemenon, Picon, Sagitaron.
Dada la lista doblemente vinculada anterior, escriba un programa que revierta la lista doblemente vinculada. ¿En qué se diferencia esta implementación de revertir la lista vinculada individualmente?