20250131 Linked List 1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vale, voy a grabar la clase hoy, por lo tanto si habláis me dais el permiso de grabar vuestra voz.
00:00:00
La última vez estuvimos haciendo un ejercicio de intentar esconder detrás de un objeto lo que era un array.
00:00:04
O sea, nosotros hemos llegado a un momento en que los arrays nos molestan, entre comillas,
00:00:18
o sea, son útiles, seguiremos utilizando y cosas así, pero son engorrosos de utilizar.
00:00:23
Entonces hemos dicho, ¿por qué no creamos unos métodos que nos esconden lo que hacemos normalmente con los arrays?
00:00:28
Es un poco el mecanismo que hacemos siempre, ¿vale?
00:00:37
Es decir, nosotros aprendemos cómo se hacen las cosas y luego abstraemos estas cosas y hacemos que otros más las hagan para nosotros.
00:00:41
todo lo que es el API de Java, todo lo que es el JDK
00:00:50
que viene con un mogollón de clases ya hechas
00:00:54
y que nosotros utilizamos, in primis string
00:00:59
nosotros desde el día uno estamos utilizando la clase string
00:01:01
y no la hemos hecho nosotros, es un objeto que ha hecho alguien más
00:01:04
sin embargo lo utilizamos como abstracción
00:01:08
si no deberíamos estar trabajando con Array de Char
00:01:11
y nosotros no queremos trabajar con Array de Char
00:01:14
entonces a partir de allí lo que hemos hecho es crear este objeto milista
00:01:17
habíamos creado al principio un milista que trabajaba con string
00:01:22
os acordáis que aquí había un array de string
00:01:26
y lo que hacíamos era identificar un constructor para crear un nuevo objeto de este milista
00:01:29
y luego teníamos una serie de métodos como añadir un string
00:01:35
Saber el tamaño de la lista
00:01:41
Escribir la lista en pantalla
00:01:45
Pillar un cierto elemento en una posición
00:01:47
Que te paso como parámetro y me devolvía un string, etc, etc, etc
00:01:52
Vimos que esto del string se nos quedaba un poquito corto
00:01:56
Porque debería haber hecho un milista por cada clase que existe
00:02:01
Ok, utilice
00:02:05
Quiero hacer un milista de string, pues tengo que hacer una clase
00:02:07
Milista string
00:02:09
¿Quiero hacer ahora una lista de animales?
00:02:10
Debería hacer mi lista de animales
00:02:14
¿Ahora quiero hacer de coches?
00:02:16
Pues mi lista de coches
00:02:20
Y así, así, así, así
00:02:21
Esto sería inviable
00:02:22
Porque clases hay infinitas
00:02:24
Y cada vez que yo quiera hacer una lista de estas clases
00:02:26
Debería crearme un nuevo mi lista
00:02:29
¿Vale?
00:02:31
Entonces, vinieron a ayudarnos
00:02:32
El concepto de tipos genéricos
00:02:35
¿Vale?
00:02:38
que veremos también ahora en el próximo tema, que son las listas, las colas, las ashmap y set y cosas por el estilo.
00:02:38
Volverá a existir esta cosa aquí, entonces aprenderemos a utilizarlo.
00:02:48
Pero esto es un comodín que me dice, yo no voy a saber qué me vas a dar tú como tipo,
00:02:52
pero cuando crearás un milista me dirás el tipo que quieres insertar en este milista
00:03:00
y yo usaré este t aquí dentro para referirme a este tipo que todavía no sé cuál es, ¿vale?
00:03:06
Entonces, donde antes tenía string, voy a poner este t y aquí tengo lista que es un array de t.
00:03:14
¿Qué es t? No lo sé.
00:03:21
Cuando crearé mi lista, si le digo eres de string, será un array de string.
00:03:22
Si le digo animal, eres un array de animal.
00:03:27
Cuando esto... Llego aquí en un momento.
00:03:30
Cuando añado algo
00:03:33
Le digo que añado un tipo T
00:03:35
Porque yo digo, hago una lista
00:03:37
De vehículos
00:03:39
Pues entonces voy a añadir
00:03:41
Un vehículo, vale
00:03:43
Y aquí dentro el método que me permite
00:03:45
Extender, crear un array
00:03:47
Un poquito más grande, de una posición más grande
00:03:50
Copiar todos los vehículos
00:03:52
Que tenía antes en el nuevo array
00:03:54
Añadir al final del array
00:03:56
El elemento que me has pasado tú
00:03:58
Que es un vehículo
00:04:00
y a este punto te digo que la lista, esta lista de aquí, es este nuevo array,
00:04:01
que es el más grande con el nuevo elemento insertado.
00:04:07
Para saber el tamaño, pues fácil, busco cuántos elementos tengo en mi array de lista
00:04:10
y te lo digo, ya está.
00:04:15
Para pillar algo, pues te digo la posición, la voy a buscar y lo devuelvo.
00:04:17
Cuidado que lo que devuelvo es un objeto T.
00:04:23
¿Qué es T? Pues siempre dependerá de cómo lo has creado.
00:04:25
¿Cómo se crea? Cuando yo creo aquí un miLista, le digo que este miLista va a contener string.
00:04:28
Lo llamo de algún nombre y creo un nuevo miLista de string.
00:04:37
Esto quiere decir que ahora dentro tendré string.
00:04:42
De hecho, estos métodos de aquí son métodos T.
00:04:46
Por ejemplo, si yo miro este, este es un add de T.
00:04:52
¿Sí? Pero si yo hago
00:04:55
M punto
00:04:58
Y voy a mirar el add
00:04:59
No hago zoom porque no puedo
00:05:01
Si no se bloquea la cosa
00:05:03
Pues veis que aquí como parámetro me da string
00:05:05
No T
00:05:08
No object, no cualquier cosa
00:05:09
Me da string porque
00:05:12
Este se ha asociado
00:05:13
Con este T de aquí
00:05:16
Con este T de aquí
00:05:18
Y por lo tanto allá donde yo tenga un T
00:05:19
Pues ahora es un string
00:05:22
¿Sí?
00:05:23
Si yo cambio esto y pongo otra cosa, aquí pongo scanner, que es otro objeto, ¿vale?
00:05:25
M2, no lo tengo que importar.
00:05:40
Pues ahora, cuando yo hago M2 punto, la add me dice que puede añadir un scanner, ¿no? Un string.
00:05:48
Porque ahora este scanner se ha asociado con el T, por lo tanto estoy trabajando con scanner, ¿vale?
00:05:55
Esto es un poquito el concepto de tipo genérico.
00:06:02
Yo creo una clase sin decir qué tipo es, pero a la hora de utilizarla, instancio ese tipo, en un cierto sentido.
00:06:05
Es como si fuera una variable que en vez de jugar con valores, juega con tipos.
00:06:14
¿Sí? Vale.
00:06:19
La única cosa que nos quedó un poquito así rara es esto.
00:06:21
¿Vale?
00:06:25
Porque a la hora de crear este objeto, de implementarlo, de instanciarlo, no lo puedo hacer con T directamente.
00:06:26
Se enfada, porque el compilador necesita saber este T que es.
00:06:37
Y como este T solo se ejecutará en un futuro cuando ya la uso y le digo que es, pues aquí se enfada.
00:06:42
Entonces, la solución que hemos encontrado nosotros es crear un tipo de objetos, o sea, una red de objetos, porque la red de objetos me admite cualquier cosa, ¿vale? Como es object, desde object hereda cualquier clase, pues en algún punto de la cadena de adherencia de cualquier objeto llegamos a object.
00:06:50
Entonces, si yo me he creado un objeto, pues aquí podré poner todos los objetos que me da la gana.
00:07:09
Y a este punto, lo que hago es decirle, pero no quiero, una vez que lo has creado,
00:07:14
has creado una red de objetos, castéalo a un objeto de tipo T.
00:07:19
Y esto es peligroso, porque normalmente esto podría dar problemas.
00:07:24
Si aquí en esta red de objetos yo había puesto gatos, coches y aviones,
00:07:29
y ahora le digo, hazme este de aquí
00:07:34
un casteo a string, pues
00:07:36
explotaría, le daría problemas
00:07:38
pero a mí no me da problemas porque
00:07:40
está de toda forma controlado, esta es una
00:07:42
cosa que estamos haciendo en el constructor
00:07:44
y por lo tanto esto cuando se crea
00:07:46
está vacío, no hay ningún objeto
00:07:48
dentro, por lo tanto no hay
00:07:50
problema de que había un gato y ahora le he dicho que es
00:07:52
un string, pues no, no había nada
00:07:54
y ahora le digo que a partir de ahora
00:07:56
es esto, y fijaos que
00:07:58
en mi lista nadie puede
00:08:00
acceder directamente a la lista, entonces nadie
00:08:02
puede acceder a la lista y decir, meto dentro un gato
00:08:04
no obstante sea una lista
00:08:06
de vehículos, y que el añadir
00:08:08
no me permita añadir cualquier
00:08:11
cosa, me permite añadir sólo lo que
00:08:12
tú me has dicho, por lo tanto
00:08:14
estoy seguro que dentro de object
00:08:16
no pueda ir algo que no es
00:08:18
un T
00:08:21
¿se entiende?
00:08:22
todo esto
00:08:26
repaso, la última vez
00:08:27
os dejé con, bueno
00:08:28
Decimos el contains, decimos cosas por el estilo, hablamos de esta cosa de que el contains va a buscar la igualdad entre los objetos de la lista y el objeto que me ha pasado aquí.
00:08:30
Y esto se hará con un equals y funciona porque en automático él elegirá el equals de la instancia.
00:08:51
vale, entonces si aquí había elegido string
00:08:59
pues esto será el equals de string
00:09:02
si yo aquí había elegido como t animal
00:09:04
pues me irá a buscar el equals de animal
00:09:06
por lo tanto me funciona
00:09:08
pero lo que tengo que hacer es claramente
00:09:09
definir un equals dentro
00:09:12
de mi objeto, si no lo hago
00:09:14
el equals será el igual
00:09:16
igual, como es el
00:09:18
equals de object
00:09:20
¿sabes?
00:09:21
os dejé
00:09:24
la última vez
00:09:25
haciendo esto
00:09:27
el remove
00:09:29
no sé si lo habéis hecho, lo más probable es que no
00:09:31
¿por qué? porque no estudiáis en casa
00:09:34
y hay dos
00:09:36
opciones de hacer el remove
00:09:38
el remove de una posición o remove
00:09:40
de un objeto
00:09:42
el remove de un objeto se podría
00:09:43
ver como busco ese objeto
00:09:46
cuando sé que posición es
00:09:48
llamo el remove
00:09:50
de la posición donde está
00:09:51
entonces rápidamente
00:09:54
vamos a implementar solo esto
00:09:56
para ver cómo se hace, ¿vale?
00:09:58
Pero muy rápidamente porque quiero hacer otras cosas hoy.
00:10:00
Entonces,
00:10:03
el remove me han dado una posición
00:10:04
del array, por lo tanto yo tengo que
00:10:06
remover esa posición.
00:10:08
El hecho es que nosotros queremos que
00:10:10
el array sea siempre compacto, no haya
00:10:12
null allí, porque
00:10:14
si pudiera emitir los null, sería
00:10:16
simplemente lista de
00:10:18
posición
00:10:20
es igual a null. Ya está.
00:10:21
Ningún problema.
00:10:29
vale pero como no quiero esto yo quiero que el lista siempre porque si no si yo hiciera esto
00:10:30
funciona pero ya el 6 no funciona porque ahora me diría tienes 10 elementos pero había borrado uno
00:10:36
y ahora en realidad hay nueve elementos pero la casilla sigue restando por lo tanto no funcionaría
00:10:45
el 6 como lo he hecho así pues tengo hacer algo un poquito más distinto que es parecido a cuando
00:10:49
lo hemos extendido, solo que esta vez tengo que encogerlo.
00:10:55
Tengo que crear un
00:10:58
array nuevo
00:10:59
de t, como
00:11:01
hacía aquí,
00:11:03
pero en vez de crearlo
00:11:06
más
00:11:08
grande, lo creo
00:11:10
más pequeño,
00:11:12
porque voy a quitar uno.
00:11:13
Luego,
00:11:18
for int
00:11:20
y es igual a 0
00:11:21
y menor
00:11:25
que posición
00:11:26
y más más, o sea, por todos los números
00:11:30
anteriores a posición, excluyendo posición, la posición
00:11:37
que me has dicho no la quiero, entonces no pongo menor o igual
00:11:42
¿vale? Tengo que copiar simplemente lista
00:11:45
dentro del nuevo, no se ven afectados los que están antes
00:11:49
entonces nuevo de y es igual
00:11:52
a lista
00:11:56
de ahí
00:11:58
ahora
00:11:59
cuando he hecho esto
00:12:01
he llegado a la posición
00:12:03
y ahora tengo un problemita
00:12:05
yo tenía este
00:12:06
array de aquí antes
00:12:10
he creado un array
00:12:11
un poquito más pequeño
00:12:13
esta es la posición
00:12:15
que quiero quitar
00:12:17
entonces hasta llegar a esta posición
00:12:18
es simplemente copiado
00:12:21
cuando
00:12:23
llego a esta posición, lo que
00:12:25
tengo que empezar a hacer es copiar
00:12:27
la posición más 1
00:12:29
dentro de la anterior.
00:12:30
¿Se entiende?
00:12:36
¿Sí? O sea, hasta
00:12:39
la posición, copio
00:12:40
directamente la 0 en la 0, la 1
00:12:42
en la 1. Cuando encuentro
00:12:44
esta de aquí,
00:12:47
empiezo a copiar la
00:12:48
3, 0,
00:12:50
1, 2, 3, la 3 en la 2,
00:12:52
la 4 en la 3, la 5
00:12:55
en la 4.
00:12:56
¿Sí? Hasta el final, saltándome la que me has dado tú.
00:12:58
Entonces, hago esta de aquí que copia la primera parte.
00:13:03
La parte a la izquierda de la posición.
00:13:07
Luego empiezo otro for, que for int y es igual a posición y menor que...
00:13:09
Depende, aquí lo puedo hacer...
00:13:25
Ponemos uno.
00:13:27
Razonamos siempre sobre lista, ¿vale?
00:13:28
Y menor que lista.length
00:13:30
Y más más
00:13:35
No, porque es menor
00:13:38
Y estoy trabajando sobre lista
00:13:40
O sea que este Y será el recorrido de este array de aquí
00:13:42
Ha llegado a posición
00:13:47
Se la salta y empieza desde posición más uno
00:13:49
Entonces, si ahora me vale posición más uno
00:13:53
Tendré que copiar en nuevo de i-1 lo que está en lista de i.
00:13:57
Si lista de i me vale 3, copio lo que hay en lista de 3 en nuevo de i-1, o sea, en nuevo de 2.
00:14:12
Si vale la posición 4, lo copio en i-1, o sea, en 3.
00:14:29
Y así hasta que acabo este array.
00:14:35
Al final, lista, es igual a 9.
00:14:40
Esto no es la primera vez que lo hacemos.
00:14:49
Esto hay ejercicios sobre array que hacen esto.
00:14:53
Otra cosa que no lo hayáis hecho en vuestra vida.
00:14:56
Pero estos ejercicios de aquí son ejercicios básicos de arrays que nosotros hemos hecho ya en la primera evaluación,
00:14:59
que están en los enunciados, buscadlos, de añade un elemento a un array o quita un elemento al array sin que haya null.
00:15:07
Son ejercicios que deberíais ya saber hacer y simplemente ahora le estamos dando un significado.
00:15:14
Hemos aprendido a hacer las cosas sin significado, a hacer ejercicios generales y ahora lo utilizamos para cosas útiles.
00:15:19
Repito que esto sería
00:15:26
Búscame el elemento S dentro del array
00:15:31
Cuando lo has encontrado
00:15:34
Me dice la posición
00:15:36
Y llamas este método de aquí
00:15:37
De esa posición
00:15:39
Ya está
00:15:40
Si ya hemos hecho el contains
00:15:40
Lo hemos hecho con boolean
00:15:47
Si en vez de hacerlo con boolean
00:15:48
Hacemos contains que me devuelve
00:15:50
O esta misma cosa de aquí
00:15:51
Que me devuelve las posiciones
00:15:52
Y yo puedo llamar este método de aquí
00:15:56
Me devuelve las posiciones donde estás
00:15:58
Y luego llamo por cada posición de este array que me ha devuelto
00:16:00
Pues llamo remove de esa posición
00:16:05
Y ya está
00:16:09
Pues esto completa lo del otro día
00:16:11
Vale, entonces hoy lo que vamos a hacer es lo siguiente
00:16:19
Paso número A
00:16:23
Recordarme esto, mi lista
00:16:24
¿Vale?
00:16:27
Hemos hecho este mi lista
00:16:29
Perfecto
00:16:30
Ahora, si nosotros vemos, mi lista tiene una serie de funcionalidades
00:16:31
Que son quita, que son añade, que son escribirlo como array
00:16:37
La idea que tengo hoy es decir
00:16:44
Vale, yo quiero hacer ahora la misma cosa
00:16:48
Pero con una implementación completamente distinta
00:16:51
¿Qué quiere decir?
00:16:54
Quiere decir que como primer paso me creo una interfaz
00:16:57
La interfaz, listas, por ejemplo
00:17:03
Y aquí escribo lo que yo quiero que haga una lista en general
00:17:08
O sea, mis listas, habíamos dicho que podía añadir un elemento
00:17:14
Pues esto de aquí, lo pongo aquí
00:17:21
Cuidado, ¿qué es este t?
00:17:26
Pues lo tendré que decir, es un tipo genérico
00:17:32
O sea, que la interfaz de listas de dime tú qué, pues tendrán que tener un método que añade un no sé qué.
00:17:35
Si string, un string. Si un animal, un animal.
00:17:45
¿Qué más puede hacer una lista en general?
00:17:49
¿Qué estoy haciendo aquí en un cierto sentido?
00:17:52
Estoy haciendo como una generalización.
00:17:56
No es lo mismo porque eso era inherencia, pero estoy haciendo algo por estilo.
00:17:59
Lo estoy diciendo, vale, me he hecho una lista, ¿vale?
00:18:03
Pero yo quiero sacar de la lista lo que todas las listas tienen que tener en común.
00:18:06
Y todas las listas tienen que poder añadir un elemento.
00:18:11
Por lo tanto, he puesto aquí un método para añadir un elemento.
00:18:16
Ahora, ¿qué más pueden hacer todas las listas?
00:18:20
Pues decir cuántos elementos tienen.
00:18:22
Pues aquí añado esto.
00:18:25
¿Qué más puede hacer una lista?
00:18:32
pues se puede escribir en pantalla
00:18:34
vale
00:18:36
tiene que tener un toString
00:18:37
que luego en realidad lo tiene siempre
00:18:40
porque tiene el de object
00:18:44
¿qué más? pues quiero poder
00:18:45
pillar el elemento n
00:18:48
de una lista
00:18:50
quiero poder
00:18:53
saber si un elemento
00:18:57
está o no en la lista
00:19:00
y finalmente
00:19:02
para no complicarlo demasiado
00:19:07
quiero saber
00:19:10
Quiero poder eliminar un cierto elemento de la lista
00:19:11
Y asumamos que aquí había otros métodos
00:19:21
Como este método de aquí, como este método de aquí
00:19:30
Pero asumamos que estos son propios de mi lista
00:19:33
Las listas en general lo que tienen que hacer es implementar estos
00:19:37
Una vez que lo he guardado
00:19:42
Yo lo que podría hacer es que mi lista
00:19:47
Implements
00:19:49
Listas
00:19:54
Y no me da errores
00:19:58
Porque ya estos métodos de aquí
00:20:06
Los tengo implementados
00:20:08
¿Están de acuerdo en lo que he hecho?
00:20:09
¿Sí? Vale
00:20:14
Entonces, lo que voy a hacer hoy en vez
00:20:15
Es el siguiente, vale
00:20:18
Ahora quiero hacer otra lista
00:20:20
Quiero hacer un objeto que haga lo mismo que esto
00:20:21
Que me esconda los arrays otra vez
00:20:24
Que sea lo que se llama una estructura
00:20:26
De datos dinámicas
00:20:28
Y veremos el lunes por qué es dinámica
00:20:29
Que yo tenga este objeto
00:20:32
Le puedo decir, añádeme un string, añádeme un animal
00:20:34
Añádeme lo que sea
00:20:36
Y él lo vaya añadiendo
00:20:36
Sin con un array decir
00:20:38
Mira, se ha acabado el espacio, tengo que poner otra cosa
00:20:41
Para esto
00:20:43
Me creo una nueva implementación
00:20:45
De listas
00:20:48
La llamaré
00:20:49
MiListaEnlazada
00:20:50
sí mi lista enlazada tendrá un tipo e implementará listas se enfada porque dice hoy mira me estás
00:20:54
diciendo que implementa listas pero no has implementado nada pues aquí le digo añade
00:21:20
los métodos no implementados y él me lo pone aquí tienes que hacer estos tengo acuerdo hasta aquí
00:21:26
O sea, que yo ahora aquí tengo una estructura, un esqueleto de una nueva clase que hará lo mismo que mi lista, pero en una versión distinta.
00:21:33
Ahora vamos a ver cómo lo hacemos distinto.
00:21:45
Pero una vez que yo la tenga, yo podré aquí hacer tranquilamente una mi lista enlazada de string, llamándola como quiera,
00:21:48
hago new mi lista enlazada de string y ponerle dentro gato, perro, banana, murciélago
00:21:56
y hacer todo lo que pueda hacer esta cosa aquí.
00:22:01
O sea, hacer la get, hacer el tu array, hacer el size.
00:22:04
¿Se entiende lo que quiero decir?
00:22:12
¿Dudas?
00:22:15
Vale.
00:22:16
Ahora, en esta implementación yo no quiero usar los arrays.
00:22:18
Si os acordáis, aquí la base de mi implementación era usar un array. Tengo un array y almacenaba las cosas allí, hacía más grande o más pequeño el array, contaba sobre el array, etc.
00:22:23
Aquí, esta de aquí, quiero que sea una implementación distinta. ¿Por qué? Porque a lo mejor implementación distintas me dan ventajas o desventajas en determinados casos.
00:22:36
Por ejemplo, yo he visto que usar el array es un poco engorroso en el añadir y quitar, ¿sí?
00:22:48
Añadir un elemento o quitar un elemento, esta implementación lo hace complejo, porque tengo que hacer un nuevo array, copiarlo, es lento.
00:23:01
Sin embargo, es súper rápido, es súper eficaz en size, porque me lo da así directamente, no hace ningún cálculo.
00:23:11
Y también en esta, la get de una posición es súper eficiente dentro de una red.
00:23:19
Pero imaginaos que yo tengo una lista donde no se hace mucho la get, se hace pocas veces,
00:23:29
pero sí lo que se hace mucho es insertar y quitar elementos.
00:23:35
Entonces, esta implementación podría ser lenta. Y a lo mejor yo hago ahora un sistema completamente distinto, un modo completamente distinto de hacer lo mismo, de almacenar estos datos, que a lo mejor es muy bueno para añadir y quitar objetos, pero a lo mejor muy lento para pillar uno, no lo sé.
00:23:38
Pero se entiende la idea de hacer distintas implementaciones
00:24:00
Se pueden hacer para lograr lo mismo
00:24:05
Pero que luego en términos de eficiencia
00:24:09
Puede ser eficiente en ciertas cosas y menos eficiente en otras
00:24:14
Yo tengo implementaciones distintas
00:24:17
Y a la hora de hacer mi programa me pregunto
00:24:20
¿Qué hago yo mucho?
00:24:23
Si hago muchas veces este tipo de operación
00:24:25
Pon esta operación de aquí
00:24:28
pues mejor que tú uses esta implementación.
00:24:30
Si en vez haces muchas veces esta operación de aquí, mejor que haga esta otra implementación.
00:24:33
Entonces elegiré entre mi lista o mi lista enlazada dependiendo de si hago muchos estos o si hago muchos estos.
00:24:39
¿Se entiende?
00:24:47
Entonces, ¿cómo vamos a hacer esta nueva implementación?
00:24:52
Es decir, si no podemos usar los arrays, ¿qué elemento de los que conocemos vamos a utilizar para poder crear una lista enlazada?
00:24:57
Y lo que vamos a utilizar son nuestros mejores amigos, los objetos.
00:25:08
Es decir, que aquí en vez de basarme sobre el array, me baso sobre un objeto.
00:25:18
¿Qué objeto? Pues un objeto que vaya a definir. No, array también es un objeto, pero array hemos dicho que no lo vamos a usar. Vamos a usar nodo. ¿Qué es nodo? Nodo es un objeto que tiene un valor y luego tiene un puntero a otro nodo.
00:25:27
entonces tendrá
00:25:59
un objeto
00:26:04
un valor
00:26:06
¿cómo se lo pongo el valor?
00:26:08
que tiene que contener
00:26:11
este nodo
00:26:12
¿qué le hacemos contener este nodo?
00:26:21
probablemente
00:26:32
no lo sé
00:26:32
porque si mi lista es de cocodrilos
00:26:34
quiero que controle cocodrilos
00:26:38
si mi lista es de gatos
00:26:40
quiero que contenga gatos
00:26:43
podría
00:26:45
hacer una trampilla y decir
00:26:46
cualquier objeto, ¿sí? Pero como ya tengo
00:26:48
los de aquí, pongámoslos así. Entonces el
00:26:55
nodo, el nodo es un objeto
00:27:07
es un objeto que tiene un campo valor
00:27:16
aquí dentro tiene el valor de este objeto, un string
00:27:24
un gat, lo que sea, ¿vale? Y luego tiene una otra
00:27:28
variable que lo que hace es
00:27:32
apuntar a otro nodo.
00:27:35
Y este tendrá un valor y apuntará a otro nodo.
00:27:44
Y esto tendrá otro valor y apuntará a otro nodo.
00:27:48
Sustancialmente, en vez de tener un array
00:27:54
con dentro todas las cosas, tengo una cadena
00:27:57
de objetos. ¿Qué es esto?
00:28:02
¿Cómo plasmo esto aquí dentro?
00:28:16
Ahora vamos a ver cómo lo hacemos
00:28:19
¿Qué es esto?
00:28:38
Este es un campo siguiente
00:28:45
¿Vale?
00:28:46
Que apunta a otro nodo
00:28:48
Porque os acordáis que cuando yo creo un objeto
00:28:50
Cuando yo creo el objeto
00:28:53
Animal x es igual a animal
00:28:54
¿Qué contiene x?
00:28:58
Contiene un objeto
00:29:02
Nope
00:29:03
El objeto animal se crea por algún lado con sus características
00:29:06
Y dentro de x yo tengo un puntero a este objeto
00:29:10
David, hola, porque si no, no salimos de esta.
00:29:16
Cuando yo hago animal x es igual a animal, aquí se crea el animal, este es el animal.
00:29:21
Pero dentro de mi variable x, dentro de mi referencia x, no está el objeto.
00:29:26
Está una coordinada en la que puedo encontrar el objeto.
00:29:32
Ahora, cuando yo creo un objeto así, ¿qué hay dentro del siguiente?
00:29:38
Un puntero, una referencia a otro objeto de tipo nodo de T, que será el siguiente nodo.
00:29:46
Esto.
00:29:57
Espera un segundo.
00:29:59
Entonces, si yo, por alguna magia, tengo este objeto de aquí, y este objeto de aquí se llama N,
00:30:00
¿cómo puedo, dado este objeto de aquí, obtener este objeto de aquí?
00:30:11
Repito la pregunta.
00:30:21
Imaginaos que yo tengo una variable n
00:30:22
Hecha de alguna forma
00:30:27
Que desde aquí
00:30:29
Me apunta este objeto
00:30:31
O sea, yo tengo una referencia a este objeto
00:30:33
¿Cómo hago?
00:30:35
A partir de n
00:30:37
A pillar este objeto
00:30:38
No es una red
00:30:40
Y el valor que tengo aquí
00:30:48
Pongámoslo que sea nodo de string
00:30:51
Esto es gato
00:30:53
Escrito como string gato
00:30:54
Esto es perro
00:30:57
como string pair.
00:30:59
Y esto es
00:31:02
Cormorano.
00:31:04
El valor no me interesa.
00:31:08
Si desde n acedo a este
00:31:10
señor y hago n.valor
00:31:13
me dirá
00:31:15
gato
00:31:17
¿Cómo acedo a este señor?
00:31:19
n.siguiente
00:31:25
n.siguiente
00:31:28
me dirá vete a este de aquí
00:31:36
y desde aquí me pillas el objeto
00:31:37
el valor, lo que hay dentro
00:31:40
del siguiente, que es este campo de aquí
00:31:43
es su segunda variable
00:31:45
ahí, ahora ya
00:31:46
lo veremos, todavía
00:31:52
estamos pillando la idea
00:31:54
luego ya veremos como lo enlazamos
00:31:56
como lo enlazamos
00:31:58
como lo enlazas, pues será
00:32:00
el encargado, este método de aquí
00:32:01
aquí tendremos que ver como lo enlazamos
00:32:04
pero por ahora, estamos
00:32:06
solo hablando del nodo
00:32:08
¿si?
00:32:09
Entonces, mi nodo tendrá, cuando yo haré en algún main, en un main de prueba, yo puedo hacer nodo de string igual a new nodo string.
00:32:11
Imaginamos que funcione
00:32:38
Luego ahora vemos que hacemos
00:32:44
No string
00:32:46
Mi nodo
00:32:47
¿Si?
00:32:50
Y ahora si yo quiero saber
00:32:52
Lo que hay dentro de este nodo
00:32:54
Haría mi nodo
00:32:56
Punto valor
00:32:58
Esto
00:32:59
Sería
00:33:05
Lo que hay aquí dentro
00:33:06
¿Si o no?
00:33:08
Y si yo quiero saber el siguiente nodo
00:33:11
El que viene después de esto, pues haría mi nodo punto siguiente.
00:33:13
Esto es un objeto de tipo nodo que apunta.
00:33:22
Y si quiero saber el nodo, el valor del siguiente nodo, ¿cómo lo haría?
00:33:27
Punto nodo, punto valor.
00:33:33
Esto es, empieza de mi nodo, vete al siguiente nodo al que apunta él, y luego mira su valor.
00:33:37
entonces en nuestro día sería
00:33:44
si esto es el primero, si este es mi nodo
00:33:48
estaría aquí, sería
00:33:50
siguiente, iría a este de aquí
00:33:52
y miraría su valor, miraría perro
00:33:54
no estamos en la lista, estamos en el concepto
00:33:56
de nodo, ahora luego
00:34:06
luchamos
00:34:07
y pensamos a cómo se hacen estas cosas
00:34:09
¿dudas?
00:34:11
ahora, para entender
00:34:15
esto, tenéis que saber
00:34:16
que es un objeto
00:34:17
y que es una referencia
00:34:18
si no tenéis idea de estas dos cosas
00:34:20
que son un mes y medio que estamos
00:34:23
hablando de estas cosas
00:34:25
pues tenemos un problema serio
00:34:26
¿sí? y probablemente
00:34:29
no vais a entender
00:34:34
las próximas
00:34:35
hora y media de clase
00:34:37
¿sí?
00:34:39
pero
00:34:42
asumamos que esto más o menos
00:34:43
está aquí, ahora, yo necesito un constructor
00:34:45
¿vale? ¿cómo
00:34:47
construyo un nodo?
00:34:49
public nodo
00:34:51
No sé si tengo que ponerle t aquí
00:34:53
Que pillará un
00:34:59
T valor
00:35:01
Lo que hará es que
00:35:03
This.valor
00:35:07
Es igual
00:35:11
A valor
00:35:13
Perfecto
00:35:15
¿Qué le pongo en siguiente?
00:35:18
Null
00:35:29
Y yo estoy creando un nodo
00:35:29
No sé todavía a quién tiene que apuntar
00:35:34
Se lo diré después
00:35:37
¿Sí?
00:35:38
Puedo hacer que estos sean accesibles directamente
00:35:41
Puedo ponerlos privados
00:35:45
Para que los maneje yo
00:35:48
Si los manejo yo
00:35:53
Tendré que poner un public tgetValor
00:35:55
Que hará return valor
00:36:02
Y luego quiero un public
00:36:07
Siguiente
00:36:11
public nodo siguiente, que lo que hace es return this.siguiente, fijaos que esto es siguiente como método, esto es siguiente como variable, son dos cosas distintas.
00:36:16
Y luego tendré un publicNodo, public void, setSiguiente, en el que me darás un nodo, en el que si tú llamas este método sobre un nodo, le estás pasando otro nodo y le estás diciendo que this.Siguiente es igual al siguiente nodo.
00:36:40
Estos son getter y setter.
00:37:19
Ahora yo aquí pondría esto.
00:37:22
Para estar seguros.
00:37:25
Todas las veces que ponéis nodo, ponéisle la T.
00:37:26
Esto se enfada.
00:37:34
Así no.
00:37:39
Bueno, ya está.
00:37:39
¿Sí?
00:37:41
Entonces yo tengo mi nodito que no es nada.
00:37:42
No hace nada nodo por sí mismo.
00:37:45
Es solo el objeto que voy a utilizar.
00:37:46
Es el elemento que me permite crear lo que se llama una lista enlazada.
00:37:48
Estoy enlazando nodos.
00:37:53
donde acaba mi lista
00:37:55
esto apunta aquí, esto apunta aquí, donde acaba
00:38:00
en aquel nodo cuyo siguiente
00:38:07
de null, si yo tengo un nodo
00:38:14
voy a mirar su siguiente y me dice null, he acabado al final de la lista
00:38:20
¿make sense? ¿donde empieza mi lista?
00:38:24
en el primer nodo, yo tendré un nodo especial
00:38:35
que es el primer nodo, que me lo guardaré
00:38:38
y diré, aquí es donde empieza la lista
00:38:41
¿y cómo es una lista vacía?
00:38:43
si este inicio de lista
00:38:50
apunta null
00:38:52
pues la lista es vacía
00:38:54
¿se entiende?
00:38:56
entonces, con estos
00:39:01
elementos, vamos a trabajar
00:39:02
entonces, nodo no lo tengo
00:39:04
aquí, ¿vale? si lo tengo que modificar
00:39:06
el considera que esta cosa aquí no me sirve
00:39:08
si tengo que modificarla o cosarla
00:39:10
pues puedo venir aquí y cambiarla
00:39:12
si se me ha olvidado algo, cosa por el estilo
00:39:14
Por ahora, vamos a mi lista enlazada.
00:39:15
¿Qué necesito como variable, como atributo, como cosa interesante para mi lista?
00:39:18
Tipo lo tengo aquí.
00:39:31
Atributos.
00:39:32
Como aquí estaban atributos, aquí como atributo había puesto esto.
00:39:33
Aquí como atributo he puesto estos de aquí.
00:39:39
No, porque estoy haciendo todo esto para no usar los arrays.
00:39:41
Efectivamente, tengo un nodo de T
00:39:47
Que es el señor primero
00:39:54
Si este señor es nul, mi lista es vacía
00:39:57
Si este señor apunta un nodo
00:40:05
A partir de ese nodo puedo recorrer mi lista
00:40:08
Yendo al siguiente, al siguiente, al siguiente, al siguiente, al siguiente, al siguiente
00:40:10
Hasta que encuentre un siguiente nul
00:40:14
Y ahí se ha acabado mi lista
00:40:17
Cuando ponga nodo 2
00:40:18
No pongo nodo 2
00:40:25
no pongo nodo segundo
00:40:27
no lo necesito
00:40:30
porque no necesito
00:40:34
esta en mi lista
00:40:36
enlazada
00:40:39
que tiene el puntero
00:40:41
primero
00:40:43
todos estos elementos de aquí
00:40:44
no los necesito aquí dentro
00:40:47
a mi me interesa solo
00:40:49
el puntero
00:40:51
al primer elemento
00:40:53
luego a partir de aquí puedo seguir
00:40:55
la cadena
00:40:57
Siguiendo
00:40:58
Toda mi lista
00:41:00
Entonces, aquí dentro lo que necesito es el primero
00:41:01
Vale
00:41:05
Podría
00:41:11
Si quiero
00:41:15
Tener un int
00:41:16
De elementos
00:41:18
Para saber
00:41:21
Cuantos elementos hay en mi lista
00:41:23
Para simplificar
00:41:25
El size
00:41:27
Pero no es necesario
00:41:28
Por lo tanto no lo pongo
00:41:30
O si queremos lo añadimos después para modificación
00:41:32
Entonces, ahora voy a empezar, por ejemplo, la añadir
00:41:35
Para hacer la añadir, lo que tengo que hacer yo es añadir un nuevo elemento
00:41:42
¿Dónde se añade?
00:41:52
Dos opciones
00:41:54
O lo añado al principio de la lista
00:41:55
O lo añado al final de la lista
00:41:58
podría tener un add
00:42:01
que me pille un elemento
00:42:04
coma una posición
00:42:06
y que me añade este elemento
00:42:08
en esta posición, lo podría hacer
00:42:10
pero por ahora
00:42:12
mantenemos en lo easy
00:42:14
¿vale? y tengo añade un elemento
00:42:16
¿dónde lo queréis añadir?
00:42:18
si lo queréis
00:42:26
en la primera posición
00:42:27
estáis creando una lista invertida
00:42:28
yo te digo gato, cocodrilo y cebra
00:42:31
y él almacenará, cuando la voy a mirar, cebra, cocodrilo, gato.
00:42:33
Porque el primero que se encontrará es el último que has metido.
00:42:39
A lo mejor es lo que quieras.
00:42:42
Normalmente cuando yo hago una lista,
00:42:45
lo que me espero es que los últimos que he añadido estén al final.
00:42:47
Entonces hagamos lo que es más conceptualmente fácil de ver,
00:42:52
aun si es más difícil de programar.
00:42:58
luego nadie me prohíbe de poner
00:43:00
at the first, que en vez de añadirla
00:43:03
al final, pues la añade al principio
00:43:05
pero ya no estaría
00:43:07
en mi lista
00:43:08
es un método propio de mi lista enlazada
00:43:10
entonces, añadíamos
00:43:13
¿cómo hago esto?
00:43:15
paso número uno
00:43:18
no, paso número uno
00:43:19
¿el?
00:43:29
¿en qué sentido?
00:43:35
efectivamente, primera cosa, miro si
00:43:42
primer nodo es
00:43:45
Null
00:43:47
Porque si es null
00:43:49
Este que estás añadiendo es el primer nodo
00:43:50
Y es fácil
00:43:54
Si no es null
00:43:54
Pues a ver qué hago
00:43:56
Entonces, asumamos que
00:43:58
Me han añadido
00:44:01
Me están añadiendo
00:44:05
Un objeto T
00:44:06
Añadir un objeto T
00:44:08
Quiere decir que no me están añadiendo un nodo
00:44:09
Me están añadiendo un valor
00:44:12
Entonces, la primera cosa que hago
00:44:15
Es crearme un nodo
00:44:17
Nodo de tipo T nuevo es igual a new nodo de tipo T de S.
00:44:19
A mí me han dicho, trabajando como string, a mí me ha dicho añade cebra.
00:44:33
Y yo lo que he hecho es crearme un nodo nuevo que contiene cebra y cuyo nuevo punto siguiente, ¿qué será?
00:44:39
Null.
00:44:49
Y esto es el que va aquí.
00:44:50
Este nuevo elemento que he hecho es el que pondré aquí y apuntará a null.
00:44:56
Perfecto, tiene que apuntar a null porque es el último de la lista.
00:45:02
No, lo estás implementando tú.
00:45:09
Es como lo queremos hacer nosotros, como hemos dicho que lo vamos a hacer nosotros.
00:45:13
Porque en una lista tiene sentido que el último que añadas sea el último de la lista.
00:45:21
Pero no necesariamente.
00:45:27
Hay estructuras de datos en que lo último que pones tiene que ser el primero.
00:45:29
Pues entonces lo implementas como que sea el primero.
00:45:33
Pero no es lo que estamos haciendo.
00:45:35
Nosotros hemos decidido que lo implementamos, que el añadir añade al fondo de la lista.
00:45:37
¿Vale?
00:45:44
Entonces, me creo lo que quiero añadir.
00:45:44
¿Sí?
00:45:48
Y ahora me pregunto, si primero es null, ¿qué hago?
00:45:48
Primero es igual a nuevo.
00:46:00
He creado un nuevo objeto, ¿sí?
00:46:05
Y si mi lista está vacía, no apunta nada, le digo, vale, tú eres el primer objeto.
00:46:08
Y se acabó.
00:46:15
Estamos de acuerdo que este tiene el siguiente null.
00:46:19
Habría hecho lo siguiente, ¿vale?
00:46:22
Creo mi lista.
00:46:29
Mi lista tiene primero, ¿vale?
00:46:30
Este es primero, que es null.
00:46:32
Ahora hago add de cebra, por ejemplo.
00:46:36
Entonces, me creo un nodo nuevo que tiene dentro cebra y que apunta null, ¿sí?
00:46:39
Y luego le digo, primero, tú eres esto.
00:46:51
Y entonces ahora tengo mi lista que se acceda primero, accederá a su primer elemento.
00:47:02
¿Sí o no?
00:47:10
Vale.
00:47:11
Ahora, asumamos en vez que no es así, que primero no da null, por lo tanto primero hay algo en primero.
00:47:12
¿Qué hago si hay algo en primero? No, crear no puedo crear otro, porque yo tengo que añadir un solo elemento.
00:47:24
Entonces, ahora estaría en la situación en la que esto lo tengo ya,
00:47:50
tengo esto, imaginamos que esto ya está,
00:47:58
y yo quiero añadir un nuevo objeto que sea jirafa, no, que sea gato,
00:48:02
porque se escribe rápido, ¿vale?
00:48:09
Entonces, este primer paso me habrá creado el nuevo elemento.
00:48:11
Aquí ahora tengo gato, que apunta null, ¿sí?
00:48:17
Ahora, lo que pasa es que antes IOPET lo tenía nul, entonces solo he dicho apunta aquí y se acabó.
00:48:25
Ahora no lo puede hacer.
00:48:34
¿Qué tengo que hacer?
00:48:36
El código.
00:48:47
No.
00:48:55
Nuevo punto siguiente, ¿qué es?
00:48:55
Seguramente.
00:48:57
¿Qué es nuevo punto siguiente?
00:49:00
¿Cuánto vale?
00:49:02
¿Qué hay dentro de nuevo punto siguiente?
00:49:03
Nul.
00:49:04
Por lo tanto, porque lo acabo de crear y se crea nul.
00:49:05
Lo que tendré que hacer es, partiendo de primero, recorrerme toda la lista.
00:49:09
De primero al siguiente, a esto al siguiente, a esto al siguiente, hasta encontrar un nodo cuyo siguiente sea nul.
00:49:24
Y eso será el último nodo de la anterior lista.
00:49:34
Entonces, lo que tendré que hacer es, a ese nodo, cambiarle el siguiente al nuevo objeto.
00:49:41
Eso es lo que tengo que hacer
00:49:48
Después de recreo lo hago
00:49:50
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 9
- Fecha:
- 31 de enero de 2025 - 12:45
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 49′ 55″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 160.07 MBytes