Domina cómo una single linked list organiza datos en memoria y por qué el acceso a un elemento exige recorrer nodo a nodo. Aquí verás, paso a paso, la representación con pointers, el papel de head y tail, y la base de la clase MySingleLinkedList para iniciar la estructura y preparar el método appends.
¿Cómo funciona una single linked list en memoria?
Una linked list guarda cada nodo en un “memory slot” independiente con un pointer al siguiente. Solo se conoce el address del head; desde ahí se avanza validando cada nodo hasta encontrar el valor solicitado. Por eso hay que recorrerla.
Cada nodo tiene un value y un next que apunta al siguiente nodo.
El sistema solo conoce el address del head. Desde ahí comienza el recorrido.
La validación es secuencial: “¿es este el valor?, no… hasta que sí y se regresa”.
El tail termina en null. Ese null permite anexar un nuevo nodo después.
¿Cómo se ve una linked list con pointers y null?
Para visualizar la idea, imagina una lista con 1, 2, 3, 4, 5. Cada número “apunta” al siguiente hasta llegar a null.
Abre el “espacio” lógico para que el siguiente pointer se asigne a un nuevo nodo.
Sin null, no habría forma clara de anexar el “seis” después del “cinco”.
¿Cómo construir la clase MySingleLinkedList y preparar el método appends?
Se inicia con una class que recibe un valor para crear la cabeza. Se fuerza la creación del primer nodo al instanciar, se ajusta la cola al mismo nodo y se lleva un conteo de elementos.
classNodo{constructor(value){this.value= value;this.next=null;}}classMySingleLinkedList{constructor(value){// cabeza con value y next en nullthis.head={value: value,next:null,};// cola apunta a la cabeza al iniciothis.tail=this.head;// conteo de elementos inicialthis.length=1;}}// Instancia inicial con el primer valorconst mySingleLinkedList =newMySingleLinkedList(1);
¿Qué ventajas aporta la clase auxiliar nodo?
Evita repetir estructura al crear nuevos nodos.
Estandariza value y next en un solo lugar.
Hace más simples los métodos que agregan o manipulan nodos.
¿Qué hará el método appends?
Recibirá un valor y creará un nuevo nodo.
Conectará el tail actual con el nuevo nodo por next.
Convertirá el nodo recién creado en la nueva tail.
Usará el null del extremo como punto de inserción.
Habilidades y conceptos que consolidas:
Modelado de datos con nodos enlazados por pointers.
Entendimiento de acceso secuencial desde head hasta encontrar el valor.
Diseño de estado interno: head, tail y contador de elementos.
Preparación de método appends para crecer la estructura.
¿Te animas a intentar appends antes de continuar? Prueba a recibir un valor, crear un nodo y convertirlo en la nueva tail. Si te atoras, deja tus dudas en los comentarios y seguimos paso a paso.
Estructura y Creación de una Lista Enlazada Simple en JavaScript
Algo importante que quiero que noten, miren cómo Diego pone esta imagen con los cuadritos al azar:
Bueno, no los puso así porque si, los puso así porque las Linked List guardan los nodos aleatoriamente en la memoria, sí, aunque esta estructura de datos solo conoce a su siguiente nodo, los nodos pueden estar guardados aleatoriamente en la memoria porque cada nodo sabe cuál es la referencia de memoria del siguiente nodo 😉
Hay dos formas en las que se puede accesar a la información.
-Acceso Aleatorio: Se puede acceder al n-ésimo elemento de una lista de elementos en un tiempo constante. Ejemplo de esto son los arreglos, ya que como se ha mencionado en el curso, se reservan espacios de memorias seguidos (sean arreglos dinámicos o no). Por esto, se puede acceder directamente a las posición 3 de un arreglo (myArray[2]).
Acceso Secuencial: En este caso, un grupo de elementos es accedido en un predeterminado orden secuencial. Las linked list son ejemplo de esto. Como no están de manera continua en memoria, para acceder a un nodo en particular, debemos recorrer la lista, accediendo a los apuntadores del siguiente elemento. Es decir, si quiero acceder a la posición 3 de la lista, debo pasar por la posición 1, luego a la 2 y ahí llego a la 3.
El recurso Array vs Linked List Data Structures lo explica muy bien 🙋🏽♀️.
Estamos rompiendo con el paradigma de prototipos de JavaScript parece clase de java. las clases no están mal, esta muy claro, pero creo que deberíamos hacer uso los prototipos y la estructura de JavaScript con funciones. Aunque al final casi todo es un objeto, pero en JavaScript son de tipo prototipos.
LinkedList y Array: Imagina que tienes una fila de personas. Si la fila de personas fuera una matriz, podrías darle a cada una un número y llamarlas por ese número. Si fueran una LinkedList, entonces para acceder a cualquiera tendrías que empezar por la primera persona y pasar por cada una de las siguientes hasta llegar a la persona que quieres encontrar.
Por lo tanto, un array siempre puede acceder a una cosa sin ninguna espera, pero es posible que tenga que mirar a cada persona en una lista enlazada.
Una LinkedList es mejor cuando no se conoce el número de cosas de antemano que se almacenan, ya que las matrices son de tamaño fijo
Me pierdo completamente con los temas y mas aun con los retos propuestos... Ya vi los cursos previos que el profesor comenta al inicio del curso, pero ¿habra algun otro que deba ver para entender mejor?
Es azúcar sintáctica nada más. JavaScript lo que hace por detrás es crear prototipos. Solo que incluyo las clases y las personas programan con clases por que es mucho más sencillo, entendible y los demás lenguajes usan las clases de la misma manera.
¡Hola! Les dejo el código con los apuntes de esta clase y la anterior, espero les sirva.
// ¿Cómo se ve una linked list?//El null permite un colocar un nodo nuevo1-->2-->3-->4-->5-->null//La linked List nos regresa un objeto, como la que se muestra a continuaciónlet singlyLinkedList ={head:{value:1,next:{value:2,next:{value:3,next:{value:4,next:null}}}}}// A continuación construimos la clase en Javascript de el objeto mostrado.//Cada uno de los elementos tiene que tener un nodo, así que hacemos una instancia del Nodo con una clase para no tener que repetir código en la class MySinglyLinkesList.classNode{constructor(value){this.value= value
this.next=null}}classMySinglyLinkedList{//El valor nos permite iniciar esta estructura de datos con un elemento dentro. constructor(value){//Cabeza de la Linked Listthis.head={value: value,next:null,}//La cola de la Linked List también está apuntada a la cabeza por lo que no existe ningún otro valor this.tail=this.head//Contamos los elementos de la listathis.lenght=1}append(value){//Recibimos el valor y lo añadimos al finallet currentNode =newNode(value)//Cambiamos el valor siguiente(next) de la cola(tail).this.tail.next= currentNode
//El último Nodo se convierte ahora en la nueva cola (tail)this.tail= currentNode
this.lenght++}}let mySinglyLinkedList =newMySinglyLinkedList(1)
MY NOTES FOR LINKED LIST
//Graficamente se veria asi la funcion de linkedlist solo //Que nos regresaria un objeto// 1 --> 2 --> 3 --> 4 --> 5 --> null//Esta es la estructura que manejan los linkedlist //Tenemos un objeto con un valor y que tendria el valor siguiente//Puesto en un segundo objeto y asi sucesivamente //Hasta llegar al valor que queremos obtenerlet singlyLinkedList ={head:{value:1,next:{value:2,next:{value:3,next:{value:4,next:{next:null}}}}}}//Creamos una clase la cual se encargara de generar nodos//Con esto cada vez que haga un metodo donde necesite inicializar// Un nodo hago una instancia de este nodo, agrego el valor//Y iniciamos el metodoclassNode{constructor(value){this.value= value;this.next=null;}}//Creamos una clase para generar el linkedlistclassMySinglyLinkedList{//Va a tener un contructor que recibe un valor por parametroconstructor(value){this.head={//Este valor viene del valor que le pasamos por parametro al constructorvalue: value,next:null,}//La cola del linkedlist la cual apuntaria a la cabeza porque no tiene ningun valorthis.tail=this.head;this.length=1;}}
Academind siempre me ayuda a entender algunos conceptos que no quedan del todo claros
Academind
Aplicando la clase con prototipos de JS.
Por cierto redefini el constructor de la clase LinkedList para iniciar con una lista vacia...
/** Define Node class */functionNode(value){this.value= value;this.next=null;}/** Define SinglYLinkedList class */functionLinkedList(){this.head=null;this.tail=null;this.length=0;}/** Define "methods" for SinglYLinkedList class */LinkedList.prototype.append=function(value){const newNode =newNode(value);if(!this.tail){this.tail= newNode;this.head=this.tail;}else{this.tail.next= newNode;this.tail= newNode;}this.length+=1;};/** Instanciated */const newLinkedList =newLinkedList();newLinkedList.append(6);newLinkedList.append(5);newLinkedList.append(1);newLinkedList.append(8);newLinkedList.append(2);newLinkedList.append(7);console.log(newLinkedList);