Operaciones en Single Link List: Búsqueda, Inserción y Eliminación
Resumen
¿Cómo emular índices en listas enlazadas?
Cuando trabajas con listas enlazadas, una de las diferencias clave respecto a las estructuras de datos como los arrays es que las listas enlazadas no tienen un índice por defecto. A diferencia de un array que nos permite acceder a sus elementos a través de un índice, en las listas enlazadas necesitamos emular este comportamiento. Para resolver este desafío, se utiliza una técnica común: la variable auxiliar, conocida como prop, que actúa como una sonda para recorrer los nodos de la lista.
¿Cómo realizar un recorrido en single link list?
Realizar un recorrido en una single link list implica moverse de nodo a nodo utilizando punteros. Al inicio, se establece una variable head que apunta al nodo inicial. Se genera una iteración que continúa mientras head no sea None. Durante este ciclo se puede imprimir o manipular la data de cada nodo:
prop = head
while prop isnotNone:print(prop.data) prop = prop.next
¿Cómo buscar un elemento en la lista enlazada?
La búsqueda de un elemento en una single link list se basa en recorrer todos los nodos hasta encontrar el elemento deseado. Si se desea buscar el elemento '2', se hace de la siguiente manera:
prop = head
target_item =2while prop isnotNoneand target_item != prop.data: prop = prop.nextif prop isnotNone:print(f"El elemento objetivo {target_item} ha sido encontrado.")else:print(f"{target_item} no se encuentra en la lista.")
¿Cómo reemplazar un elemento en la lista?
Remplazar un elemento requiere primero buscarlo y luego asignar el nuevo valor. Por ejemplo, si deseamos reemplazar el '3' con la letra 'Z':
prop = head
target_item =3new_item ='Z'while prop isnotNoneand target_item != prop.data: prop = prop.nextif prop isnotNone: prop.data = new_item
print(f"{new_item} replace the old value in the node number {target_item}")else:print(f"{target_item} no se encuentra en la lista")
¿Cómo manipular nodos en la lista enlazada?
Manipular nodos implica insertar, eliminar o mover nodos dentro de la lista. Esta sección aborda cómo insertar nodos al inicio o al final de la lista, además de eliminarlos desde distintas posiciones.
¿Cómo insertar un nuevo elemento al inicio?
Para insertar un nuevo nodo al principio, puedes redefinir head apuntándolo al nuevo nodo que ya tiene head como su nodo siguiente:
new_node = Nodo('F')new_node.next= head
head = new_node
¿Cómo insertar al final y en una posición específica?
Para insertar al final sin un índice, utiliza un bucle para llegar al último nodo y luego conecta el nuevo nodo:
new_note = Nodo('K')if head isNone: head = new_note
else: prop = head
while prop.nextisnotNone: prop = prop.next prop.next= new_note
Para insertar en una posición específica, es crucial tener un mecanismo que recorra los nodos y ubique el índice de inserción:
index =3# Posición deseadaprop = head
nuevo_nodo = Nodo('Valor')while index >1and prop.nextisnotNone: prop = prop.next index -=1nuevo_nodo.next= prop.nextprop.next= nuevo_nodo
¿Cómo eliminar un nodo de la lista?
Para eliminar el nodo al inicio, se realiza el ajuste del puntero head:
remove_item = head.data
head = head.next
Para eliminar al final o desde una posición específica, se debe tener un control sobre el nodo actual y el siguiente, pero prevenir que el código se interrumpa antes de su tiempo:
# Para eliminar en la última posiciónprop = head
while prop.next.nextisnotNone: prop = prop.nextprop.next=None
Con estas instrucciones, mejorarás tu comprensión y dominio de las listas enlazadas. Te alentamos a que practiques y explores estas operaciones para incorporarlas como métodos dentro de tus propias implementaciones. Seguir aprendiendo sobre estructuras de datos fortalecerá tus habilidades como desarrollador. ¡Sigue adelante!
Cuando el profesor solo hace una narrativa del código que esta escribiendo, ya la clase no es educativa, para que entendamos bien lo que estamos haciendo en especial en esta clase es mostrar así estaba y asi quedo despues de tal operación, en lo personal logre finalizar la clase con muchos baches, y para reforzar no es repasar el video sino ir a buscar a youtube alguien que si lo pueda explicar mejor, y que lastima porque uno paga para evitar la busqueda y tener una ruta mas limpia.
concuerdo
Describes perfectamente por lo que estoy pasando. Me tocó parar las clases y buscar por mi cuenta en otro lugar...
creo que esta clase esta muy apresurada, mucho codigo y nada de ejemplos practicos, para entender mejor
Cada nodo es independiente y ocupa un espacio en memoria mínimo, y no es necesario modificar todos los nodos para operar en alguno.
Las Estructuras de datos son una materia base en las Ciencias de la Computación, cuando era estudiante las ví en Java SE, te recomiendo un libro de Estructuras de datos en Java del autor Luis Joyanes Aguilar, ya que si deseas profundizar en el tema desarrollarás tus habilidades de lógica considerablemente. También te recomiendo tomar un Curso de matemáticas discretas, ya que es complementario.
El código presentado, divido por comentarios, y con sus respectivas salidas.
from node importNode# *Creación de los nodos enlazados(linked list)head =Nonefor count inrange(1,6): head =Node(count, head)# *Recorrer e imprimir valores de la lista
probe = head
print("Recorrido de la lista:")while probe !=None:print(probe.data) probe = probe.next
Recorrido de la lista:54321
# *Busqueda de un elemento
probe = head
target_item =2while probe !=None and target_item != probe.data: probe = probe.nextif probe !=None:print(f'Target item {target_item} has been found')else:print(f'Target it
Target item 2 has been found
# *Remplazo de un elemento
probe = head
target_item =3new_item ="Z"while probe !=None and target_item != probe.data: probe = probe.nextif probe !=None: probe.data= new_item
print(f"{new_item} replace the old value in the node number {target_item}")else:print(f"The target item {target_item} is not in the linked list")
Z replace the old value in the node number 3Recorrido de la lista:54Z21
# *Insertar un nuevo elemento/nodo al inicio(head)head =Node("F", head)
Recorrido de la lista:F54Z21
# *Insertar un nuevo elemento/nodo al final(tail)new_node =Node("K")if head is None: head = new_node
else: probe = head
while probe.next!=None: probe = probe.next probe.next= new_node
Recorrido de la lista:F54Z21K
# *Eliminar un elmento/nodo al inicio(head)removed_item = head.datahead = head.nextprint("Removed_item: ",end="")print(removed_item)
Removed_item:FRecorrido de la lista:54Z21K
# *Eliminar un elmento/nodo al final(tail)removed_item = head.dataif head.next is None: head =Noneelse: probe = head
while probe.next.next!=None: probe = probe.next removed_item = probe.next.data probe.next=Noneprint("Removed_item: ",end="")print(removed_item)
Removed_item:KRecorrido de la lista:54Z21
# *Agregar un nuevo elemento/nodo por "indice"inverso(Cuenta de Head-Tail)# new_item =input("Enter new item: ")# index =int(input("Enter the position to insert the new item: "))new_item ="10"index =3if head is None or index <=0: head =Node(new_item, head)else: probe = head
while index >1 and probe.next!=None: probe = probe.next index -=1 probe.next=Node(new_item, probe.next)
# *Agregar un nuevo elemento/nodo por "indice"inverso(Cuenta de Head-Tail)Recorrido de la lista:54Z1021
# *Eliminar un nuevo elemento/nodo por "indice"inverso(Cuenta de Head-Tail)index =3if head is None or index <=0: removed_item = head.data head = head.nextprint(removed_item)else: probe = head
while index >1 and probe.next.next!=None: probe = probe.next index -=1 removed_item = probe.next.data probe.next= probe.next.nextprint("Removed_item: ",end="")print(removed_item)
Removed_item:10Recorrido de la lista:54Z21
Excelente aporte
Escribiste (o se copió mal) el método para buscar un elemento.
Debería ser:
probe = head
target_item =2while probe !=None and target_item != probe.data: probe = probe.nextif probe !=None:print(f'Target item {target_item} has not been found')else:print(f'Target it Target item 2 has been found')
¿Y el uso práctico de estos temas? 🤔 Mucho código pero siento un poco a la carrera la explicación de lo que se está haciendo.
pienzo lo mismo
Esto solo es util en desarrollo de software
Cuando tengas un problema donde necesites almacenar datos y leer datos tienes que escoger la estructura de datos que te brinde la solución mas óptima en cuanto a memoria y tiempo. En el caso de las Linked Lists son muy buenas para optimizar memoria. A comparacion de las listas o arreglos que son buenas para leer datos pero ocupan mucho en memoria.
Este curso me está volviendo loco. La verdad no me gusta para nada este profesor ni su método de enseñanza. ): Manden ánimos.
La primera vez que tome clases con Hector Vega pensaba lo mismo, pero me di cuenta que tenia 2 opciones: O quejarme y dejar el curso o continuar e investigar con mas fuentes; tome la segunda opción y ahora me doy cuenta de que Hector es un gran profesor. Se siente genial aprender mas cosas de lo que un curso inicialmente ofrece
estamos igual :/
Una aclaración.
En el minuto 3:25 la razón por la cual no se imprime la variable de prueba "probe" es porque en la linea anterior se habia asignado a "probe" la referencia de "head" que era =None. (puesto que en el ciclo anterior la ultima referencia de head fue None)
Por lo tanto al referenciar "probe" a None esta no entra al ciclo while.
Joya de aportación.
Gracias por esa aclaración!
desde la clase pasada lo que mas menciona es que es complejo y que es complejo, y hasta cierto punto lo es pero si hubiera sido un buena clase, no solo tirar codigo creo ya no fuera tan complejo......
Es verdad, no se detiene un poco a explicar con más claridad, prácticamente solo narra lo que escribe, pero no se detiene a explicar por ejemplo, un poco la función que acaba de programar. Falta ser más específico, es mejor lento pero seguro pues Platzi se vende como plataforma para principiantes y muchos tomamos una ruta y no hemos trabajado en la industria y por más que se avance curso tras curso nos falta experiencia y nos cuesta para entender explicaciones como estas
No quiero sonar fanboy. Pero para los que sientan que el problema es que la clase va demasiado rápido. La respuesta es NO.
Leyendo los comentarios he visto y asumo y si me equivoco les pido una disculpa.
Pero creo que la mayoría comienza a programar desde lenguajes de medio/alto nivel y están demasiado acostumbrados a usar métodos y no se detienen a pensar en como funcionan los mecanismos internos de esos métodos.
Quisiera compartirles un poco de mi historia. yo empecé por aprender python como mi primer lenguaje y me estanque con lo de las lista y diccionarios 😂 no las entendía así que lo deje.
Pero después investigando descubrí que python fue hecho en C y decidí aventarme a C por que quería saber como había sido hecho python y me tropecé con los punteros, el quebradero de cabeza que me di 😂 los nodos y el manejo de memoria era el pan de cada día y era difícil y tampoco los entendía del todo y descubrí que había un lenguaje mas abajo de C y era ensamblador
(si estoy un poco loco XD) PERO solo cuando toque los fierros de la maquina (sin albur 😂) comprendí como funcionaban las cosas, entendí mejor a C y al entender a C ahora que estoy con python entiendo mucho mas cosas de python que si solo me hubiera quedado aprendiendo implementaciones y métodos.
lo que voy a decir sonara tabu pero si quieren aprender un lenguaje o comprenderlo mejor denle una vuelta a C y a ensamblador no se van ha arrepentir en especial si estan empezando o si ven que los códigos escritos como los que se hicieron en estas clases van muy rápidos o son confusos.
les quiero compartir una charla de por que todos los programadores deberían conocer ensamblador impartida por un profesor de la universidad de Alicante.
PD: Comencé con Python y termine enamorándome de C y ensamblador 🧡
Muchas gracias por el aporte, creo que es valioso lo que dices. Y sí, estos temas se hacen mas amenos cuando entendemos todo el manejo de variables y referencias. Y claro cuando entramos de fondo a C y a ensamblador.
Adicional al video tienes información recomendada al respecto?
Gracias
Comprendo completamente tu punto de vista, sin embargo, se supone que la clase debería estar diseñada para pasar por los conceptos con los cursos anteriores, no deberías regresar a aprender otro lenguaje más a fondo para poder sobrellevar estos temas. Tu opinión es súper valiosa porque nos abre las puertas como programadores, pero la clase no está bien planificada para el objetivo que es poder comprender qué se está haciendo. En conclusión, sí debería ir más lento y explicar mejor que hace, no sólo leer el código.
por andar a las carreras va sacando código con errores, en el método de buscar un item como es posible que genere nodos con valores del 1 al 5, y cuando busca el 2 y le sale que no existe dice que efectivamente no existe xD
soy re fan de platzi pero este curso me esta dando pena...
No mas por aclarar, el item 2 si existe en la linked list, el problema es que cuando lo intentó recorrer usando:
while head !=None:print(head.data) head = head.next
Dejo head apuntando al final de la linked list, por lo al asignar probe = head, probe ya es None y no entra al While
Tal cual, 2 minutos de video sin nisiquiera reconocer que algo andaba mal.. y dando excusas falsas.. la verdad no entiendo, estaba muy apurado al hacer el curso? y si ya dos personas denotan el error porque no lo arreglan?
Muchas gracias por tu aporte.
Concuerdo totalmente con tu punto de vista
dice que usemos la terminal para que fuera mas claro todo pero en mi caso fue la peor idea, no entendi nada y tuve que ver el video varias veces y pausarlo ,hubiera sido mejor hacer un script y comentar linea por linea y analizarla o usar la herramienta de debuggin para ver que hace el codigo ya que la idea era ver como se ejecuta el codigo en terminal en tiempo real pero no se logro el objetivo por que en la mayoria de los ejemplos no se muestra que es lo que esta pasando y se vuelve mas confuso a mi parecer
siento que este tema es para darlo mas lento y extendido, por mi parte ya me compre otro curso y voy a practicar lo básico en hackerrank
¿cómo me vas a decir hector en el minuto 5:06 que el elemento 2 no está en la lista si la lista son los números del 1 al 5?
¡Esto pasa porque realmente no estamos haciendo ningún recorrido en el ciclo while! ¡la variable probe entra siendo None desde antes de iniciar las iteraciones cuando decimos probe = head! No entiendo como puede el profesor estar tan tranquilo con un error de estos que lo confunden tanto a uno como estudiante. Si me estoy equivocando agradecería que alguien me lo dijera
Asi es, creo que los errores se pueden aceptar en clases presenciales o en vivo, pero al ser una clase grabada se supone que lo veremos miles de alumnos en diferentes momentos. Creo que le falta auxiliarse de un equipo de expertos en prgramacion o el tema a los directores de curso para que no dejen pasar estos errores
Falso, el error fue que desde un principio siempre uso la variable original head, lo que debio hacer es dejarla inicializada y comenzar a cambiarla antes de cada while.
Ejemplo:
from node import Node
# How to make a single link list tour?
head = None#We create different nodes because we iterate a range between 1 to 6for count in range(1,6): head = Node(count, head)
print("First Tour:")#Here we iterate with a while loop starting from five to onecurrent = head # Use a separate pointer 'current' for the first traversalwhile current != None: print(current.data) current = current.next
# To make a "tour", reset a pointer back to the headprobe = head
print("\nSecond Tour:")# Now 'probe' starts at the beginning of the list againwhile probe != None: print(probe.data) probe = probe.next
# How to search for an item in the linked list?
probe_class = headtarget_item = 2
while probe_class != None and target_item != probe_class.data: probe_class = probe_class.nextprint(f"probe_class {probe_class.data} is automatically false")
if probe_class != None: print(f"Target item {target_item} has been found")else: print(f"Target item {target_item} is not in the list")#MINUTE 5:12
En otros cursos felicitan a los profesores por dejar los errores y corregirlos, pero en este curso hay falta de profesionalidad, en saber aprender y no apuntar al que te esta explicando, sea pagado o no, una sola forma de explicar no funciona para el 100% del mundo.
definitivamente es otra pesima clase , y no se trata de ir y averiguar o consultar otras fuentes para entender o profundizar en el tema, el profesor Hector , se pone hacer solito el codigo y no explica cual va ser el objetivo y toca estar tratando de adivinar y a parte no explica . Las estructura de datos se deberian explicar a modo gráfico antes de ir a código. Ya toco ir a ver el curso de estructura de datos de codigo facilito.
Otra clase mal explicada, al crear la lista inicial no hace nada ya que al final head le queda en None, de ahí para allá como no tiene una lista de nodos NO PRUEBA NADA, con mucho respeto creo que el profe no organizó bien su clase o tiene falla en los conceptos que intenta explicar, la clase anterior su puntero "tail" era la cabeza y en esta clase también hay algunas fallas en su código como por ejemplo cuando hace la funcionalidad para "removed_item", lo quita junto con todo lo que hay después de ese item.
Al comienzo (minuto 3:07) cuando declara la variable "probe", ahí debía imprimir la lista, al ser un puntero temporal puedo recorrer la lista sin perder su información pero no imprime nada, por que? porque cuando imprimió usando el puntero "head" la perdió, no tiene ningún sentido recorrer una lista para perderla, en fin, pésima clase.
Solo quería recomendar que para este tipo de explicaciones sería mejor utilizar Notebook de Jupyter o DeepNote, se los recomiendo porque es mas práctico.
El profesor es bueno para ilustrar y aclarar conceptos, sin embargo, siento que por el afán de explicar y echar código como si ya fuerámos expertos y entendiéramos a la primera, se pierde el interés en el curso y nos obliga a buscar otras fuentes. Aclaro, siempre hay que buscar otras fuentes además de estás clases pero por primera vez me está tocando ir primero a fuentes externas para luego venir acá y entender poco a poco lo que explica el profesor. Para mi Platzi se ha caracterizado por ayudar a entender conceptos básicos o complejos de forma preliminar de una forma muy sencilla, pero siento que este curso está siendo todo lo contrario. Espero lo puedan mejorar a futuro.
Siento que el tema se vuelve denso, más aún cuando no hay una aplicación real. Creen lo mismo?
Son ejemplos complejos, que deben ser aclarador más a fondo.
Lo mejor que encontré parecido pero en inglés:
Singly Linked List Data Structure with Operations
¿Por qué hacer todo sobre la terminal y no sobre el edito de código?
Sí tienes un typo a reescribir todo de nuevo.
supongo que no conoce Jupyter Notebooks.
lo mismo he pensado que porque hace todo desde la terminal
A alguien más le pasa que la clase al min 9:42 se corta? :( He recargado la página varias veces y la clase dura 16 minutos pero siempre se me corta al 9:42 :(
¡Hola!
No he tenido ese problema. Puedes recargar la página cuando llegue a suceder eso y el video cargará de nuevo. También puedes probar un servidor diferente, hay tres: A, B, C. Los puedes seleccionar dando clic en el engrane ⚙️ de configuración que está en la barra de reproducción del video. Por último podrías probar otro navegador o eliminar el caché del que usas normalmente.
Yo no he tenido ese problema, pero puede llegar a pasar.😉