Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Clase 26-02-24 - 2 - 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:
cuando queramos ya una lista concreta
00:00:00
para guardar datos, instanciaremos
00:00:03
un objeto de estos, una lista enlazada
00:00:04
lo que instanciaremos
00:00:07
igual que cuando queríamos guardar datos en un array
00:00:08
instanciamos un array
00:00:11
pues aquí instanciaremos
00:00:13
un objeto de estos para guardar datos
00:00:15
vale, este objeto ya hemos
00:00:17
dicho antes, ¿por qué se va a caracterizar
00:00:19
este objeto? se caracteriza
00:00:21
única y exclusivamente por la dirección
00:00:23
del primer elemento, nada más, por la dirección del
00:00:25
primero
00:00:27
esto es una lista enlazada, se caracteriza por la dirección
00:00:27
del primero, vale, pues la dirección del primero
00:00:31
¿de qué tipo es? pues de esta clase
00:00:34
que tendremos que programar
00:00:39
vale, entonces en principio esto es una propiedad
00:00:41
interna
00:00:45
privada del objeto lista
00:00:46
una propiedad privada que nadie tiene por qué conocer
00:00:49
la dirección inicial de la lista nadie tiene por qué conocerla
00:00:53
vale
00:00:56
pues nada
00:01:00
lo que pasa es que claro
00:01:02
tendremos que crear la clase
00:01:04
nodo para que cuanto antes nos quite
00:01:06
este error de compilación
00:01:08
bueno pues entonces esta lista enlazada
00:01:09
tenemos que decidir
00:01:17
que tipo de datos va a guardar
00:01:18
va a guardar números, va a guardar
00:01:21
cadenas, que va a guardar
00:01:23
bueno vamos a hacer un ejemplo de lista enlazada
00:01:24
para guardar cadenas
00:01:27
que es el que hemos dicho en la pizarra y ya está
00:01:29
luego tendremos que ver como generalizarlo
00:01:31
claro, pero para guardar cadenas hay que elegir
00:01:33
qué tipo de dato quieres que guarde
00:01:35
pues venga, cadenas, igual que cuando
00:01:36
instanciamos un array, elegimos
00:01:39
qué tipo de dato queremos que guarde
00:01:41
vale, pues la clase
00:01:46
esta será la clase a la que pertenecen
00:01:47
cada uno de los objetos
00:01:50
que están dados de la mano en mi lista
00:01:51
cada uno de ellos, y ya hemos dicho
00:01:53
que tendrán dos campos
00:01:56
el dato en sí
00:01:57
y la dirección del siguiente
00:01:59
que la tiene que llevar ahí
00:02:01
acoplada de la mano la dirección del siguiente
00:02:04
¿Vale?
00:02:06
Entonces
00:02:12
Para que no se complique mucho el código
00:02:12
Como las dos van juntitas
00:02:15
En el mismo paquete
00:02:17
Y se van a estar usando la una a la otra
00:02:18
Pues no voy a poner privado
00:02:20
Para que lista enlazada
00:02:23
Pueda usar los atributos
00:02:25
De nodo sin get y set
00:02:27
¿Vale? Los dos como en pack hacen una estructura
00:02:28
Esto no es que sea una entidad
00:02:31
No estoy haciendo yo una aplicación
00:02:32
Entonces así más común
00:02:34
lo que sí que vamos a hacer va a ser un constructor con parámetros
00:02:36
que eso sí que siempre es muy cómodo para instanciar
00:02:40
un nodo, vale
00:02:43
entonces, punto dato
00:02:44
igual a dato
00:03:03
punto siguiente, igual a
00:03:05
vale, tiene el constructor y repito, no le pongo get y set
00:03:11
porque no le he puesto el privado para que lista enlazada pueda acceder
00:03:18
directamente y puedan trabajar los dos en pack
00:03:22
más cómodamente
00:03:24
bueno, pues el nodo es esto
00:03:25
la clase nodo es esta, la clase nodo es la que
00:03:27
pertenece a cada uno de los nodos que tienen
00:03:30
sus dos partes, dato y siguiente
00:03:32
y ya está, con su constructor
00:03:34
cuando hago un constructor con parámetros
00:03:36
inhabilito
00:03:38
el vacío sin parámetros
00:03:40
entonces eso puede hacer
00:03:41
limita un poco la funcionalidad
00:03:44
porque si yo quiero usar alguna vez el sin parámetros
00:03:48
si he creado
00:03:50
este, ya sabéis que este entonces
00:03:52
o lo pongo específicamente o ya no existe
00:03:53
bueno, lo ponemos específicamente
00:03:56
para poder usarlo si es que queremos
00:03:58
es de lista enlazada
00:03:59
vale, y ahora
00:04:00
cuando nosotros tengamos un main
00:04:03
a ver, yo voy a hacer
00:04:05
un paquete aparte con un main para ver
00:04:08
qué es lo que esperamos de estos objetos
00:04:09
qué es lo que esperamos
00:04:11
esperamos que guarden datos, claro
00:04:12
entonces me voy a hacer yo el paquete main
00:04:14
con una clase
00:04:18
main
00:04:25
vale
00:04:27
pues para que hemos hecho estas dos clases
00:04:34
que es lo que esperamos de ellas
00:04:37
pues esperamos instanciar
00:04:38
un objeto lista enlazada
00:04:40
esperamos
00:04:42
instanciarlo
00:04:45
lo que queremos es simular este comportamiento
00:04:46
que yo me hago
00:04:58
mi objeto lista enlazada
00:05:00
como si me hiciera una array
00:05:02
lista, ah es que he puesto enlazado
00:05:04
vale, enlazada
00:05:12
ahí
00:05:14
yo lo que espero
00:05:17
de esto que estoy haciendo es
00:05:19
crearme un objeto de estos
00:05:20
como me creaba un array
00:05:22
y ahora con este objeto
00:05:24
lo que a mi me gustaría es poder usarlo para
00:05:26
meter string
00:05:29
dentro de ellos, por ejemplo así
00:05:31
esto, me gustaría poder hacer esto
00:05:32
que ahora quiero meter otra cadena
00:05:36
más en mi lista
00:05:38
pues mira, me gustaría poder
00:05:39
hacer esto y ahora ponerle otra cadena
00:05:42
que ahora quiero recuperar
00:05:44
elemento que está en la posición 0
00:05:48
de esta lista, por ejemplo
00:05:50
pues me encantaría poder hacer esto
00:05:52
lista.get y pasarle yo la posición
00:05:55
por ejemplo, un método get
00:05:57
que me recupera el elemento de posición 0
00:06:01
también me encantaría poder hacer esto
00:06:03
si yo tengo la lista
00:06:06
poder borrar
00:06:07
el elemento que está en la posición 1
00:06:09
por ejemplo, me encantaría poder hacer esto
00:06:11
decirle, oye, bórrame el que está en la posición 1
00:06:14
estaría estupendo
00:06:16
esto es lo que nosotros pretendemos
00:06:17
cuando hacemos esta clase
00:06:21
pretendemos tener ahí un objeto
00:06:22
que yo pueda usar para guardar
00:06:25
cosas en él, para recuperarlas
00:06:27
por posición
00:06:29
para eliminarlas por posición
00:06:30
y muchas otras que se me puedan ocurrir
00:06:32
aquí he puesto tres básicas
00:06:35
insertar dato
00:06:37
recuperar por posición
00:06:40
borrar por posición
00:06:42
y si yo tuviera esto, esto es mucho más cómodo
00:06:43
que un array
00:06:46
esto sería mucho más cómodo que un array
00:06:46
si quisiéramos
00:06:49
estas cadenas en un array y quisiéramos
00:06:51
recuperar del array y eliminar
00:06:53
pues meter en el array
00:06:55
ya hemos visto que no es tan fácil, meter en el array
00:06:57
cada vez que hemos tenido que meter
00:06:59
hemos tenido que hacer una adicional, copiar
00:07:00
pegar, etcétera, si yo pudiera
00:07:03
hacer esto, mira que fácil
00:07:05
añado y ya está y que la lista vaya creciendo
00:07:06
en el caso de
00:07:09
recuperar por posición, el array eso sí que era sencillo
00:07:11
el array poníamos corchetes 0
00:07:13
y se acabó, eso sí, ahí no vamos a ganar nada
00:07:15
eliminar
00:07:17
pues mira que estupendo, si yo tuviera
00:07:19
un método que le doy la posición y me lo quita de la lista
00:07:21
genial
00:07:23
en el array teníamos que hacer un montón de cosas
00:07:24
para eliminar, pues esto es lo que queremos
00:07:27
simular, un objeto
00:07:29
de esta clase que yo me estoy haciendo
00:07:31
al que puedo meter datos
00:07:33
puedo consultarlos
00:07:35
por posición, recuperarlos, borrarlos
00:07:37
lo que quiera, eso es lo que queremos simular
00:07:39
bueno, pues que es lo que tendremos que hacer
00:07:41
entonces? Pues meter estos
00:07:43
métodos, add, get, remove
00:07:45
estos métodos, meterlos aquí
00:07:47
programarlos yo
00:07:48
programarlos y ya está
00:07:51
la estructura ya la tenemos
00:07:52
cada objeto de la lista va a tener
00:07:54
estos campos
00:07:57
y la lista se caracteriza por
00:07:58
su inicio y por nada más, no le hace
00:08:01
falta nada más para caracterizarse su inicio
00:08:03
¿ahora qué nos falta?
00:08:05
pues hacer los métodos, vamos a hacer los métodos
00:08:07
que me han dicho, pues venga
00:08:09
¿cuál me gustaría hacer? el de añadir
00:08:11
pues venga, vamos a hacer un método de añadir
00:08:13
aquí
00:08:17
si yo lo quiero usar desde fuera
00:08:20
de la clase
00:08:22
que querré, porque esta es una
00:08:25
estructura que yo estoy haciendo para usar luego
00:08:26
para guardar datos de donde quiera
00:08:28
pues hombre, este método debería ser público
00:08:29
vale, y este
00:08:32
método de añadir
00:08:34
¿qué le tengo que pasar yo?
00:08:36
pues un dato del tipo
00:08:38
de los que tú vas a guardar en tu lista
00:08:40
pues en nuestro caso, como estamos trabajando
00:08:42
con string
00:08:44
pues este es el método que queremos programar
00:08:45
vale
00:08:49
pues entonces
00:08:52
ahí que tenemos que hacer
00:08:54
pues lo que tenemos que hacer aquí
00:08:56
es
00:08:58
tenemos nuestra lista
00:09:00
en principio nuestra lista es esto
00:09:07
tenemos aquí el inicio
00:09:10
este
00:09:12
el inicio, bueno, no se ve mucho
00:09:13
pero da igual
00:09:19
inicio, apunta
00:09:19
En el caso genérico
00:09:23
Pues aquí tenemos
00:09:26
Esto
00:09:27
Este a su vez
00:09:29
Apunta
00:09:31
A este
00:09:34
Y este a su vez
00:09:37
Este ya apunta
00:09:42
A nulo
00:09:48
Vale
00:09:57
Esta es la lista genérica
00:09:58
Vale, ¿qué queremos hacer?
00:10:05
Cuando añadimos
00:10:08
Pues lo que vamos a tener que hacer va a ser
00:10:09
crear un nodo nuevo, es obligatorio
00:10:11
habrá que crear un nodo nuevo
00:10:14
donde en el
00:10:15
dato le pondremos
00:10:20
lo que me han pasado, esto es lo primero que habrá
00:10:21
que hacer, crear un nodo nuevo sí o sí
00:10:23
es lo primero que habrá que hacer en el añadir
00:10:25
pues venga, vamos a hacer eso primero, sí o sí
00:10:27
vamos a crear el nodo nuevo
00:10:29
este es el nodo nuevo
00:10:31
ala, eso es lo primero
00:10:33
que ya hemos hecho, crear mi
00:10:38
nodo nuevo que tengo que meter en la lista
00:10:40
tengo que meterla, vale
00:10:42
crear mi nodo nuevo
00:10:44
vale
00:10:45
ahora, a ese nodo
00:10:46
le vamos a poner como dato
00:10:49
esto que me han pasado aquí
00:10:52
eso está claro, ¿no?
00:10:56
silencio los de atrás
00:11:02
este nodo nuevo
00:11:03
tendré que pasarle yo en su campo
00:11:05
dato, en su campo dato
00:11:07
que es este de arriba, porque cada
00:11:09
cada nodo
00:11:11
recordad que tiene dos campos
00:11:13
el campo dato
00:11:15
Y el campo
00:11:17
Siguiente
00:11:20
¿Vale? Tiene los dos
00:11:26
El campo dato y siguiente
00:11:28
Pues al campo dato
00:11:30
Y este nodo se llama
00:11:32
Esto que hemos hecho aquí
00:11:33
Este es el
00:11:35
El nodo que acabo de hacer
00:11:39
El objeto nodo que acabo de hacer
00:11:42
¿Vale? Este
00:11:44
Moisés
00:11:46
¿Te callas o te corto la cabeza?
00:11:48
Bueno
00:11:51
No sé si es lo que más
00:11:52
lo que más te costaría prescindir
00:11:54
a ver
00:11:56
este es el objeto
00:11:58
que acabamos de crear
00:12:02
¿vale?
00:12:03
que es este
00:12:06
el objeto que acabamos de crear
00:12:07
este
00:12:09
a su campo dato
00:12:09
le estamos poniendo
00:12:14
el dato que me pasan
00:12:15
está claro ¿no?
00:12:17
y ahora viene lo complicado
00:12:18
decir vale
00:12:20
y ahora
00:12:21
¿cómo hago yo con estos enlaces?
00:12:22
¿cómo hago yo con estas flechitas?
00:12:25
para que se dé de la mano con los otros
00:12:26
y forme parte de la lista.
00:12:29
¿Cómo hago?
00:12:32
A ver, hay dos opciones.
00:12:34
Podríamos meterlo al principio o meterlo al final.
00:12:36
La lista enlazada que ya está hecha en Java
00:12:41
me da las dos posibilidades.
00:12:43
Una es más fácil de programar que la otra.
00:12:45
Vamos a programarla fácil ahora mismo, la facilita.
00:12:48
Porque tampoco vamos a perder tiempo
00:12:51
programando todas las funcionalidades
00:12:53
si ya están hechas.
00:12:55
Vamos a programarla facilita.
00:12:56
Bueno, vamos a pensar, ¿cómo podría yo meter este aquí?
00:12:58
Hombre, pues mira, con dos únicas sentencias ya lo inserto.
00:13:01
Es decir, si yo copio en el campo siguiente lo que hay en inicio.
00:13:07
Imaginaos que hago esta asignación.
00:13:13
Imaginaos que hacéis esta.
00:13:15
Nodo punto siguiente igual a inicio.
00:13:17
Mirad esta asignación de aquí.
00:13:24
Nodo siguiente igual a inicio
00:13:25
¿Qué estamos haciendo con esta asignación?
00:13:27
Con esta asignación lo que estamos haciendo es
00:13:30
Que este pase a apuntar
00:13:32
A donde apunta este
00:13:34
Luego lo que estamos haciendo es que este empiece a apuntar
00:13:35
No, esto no quiero
00:13:39
Que este
00:13:40
Empiece a apuntar
00:13:42
Ahí, ¿verdad?
00:13:43
Eso es lo que estamos haciendo
00:13:49
Eso es lo que hemos hecho con esta única sentencia
00:13:50
¿verdad? con esta única sentencia
00:14:03
hola
00:14:06
pasa
00:14:07
con esta única sentencia
00:14:08
lo que hemos hecho es que
00:14:12
este pase a apuntar
00:14:13
aquí ¿está claro?
00:14:16
modo siguiente
00:14:19
igual a inicio
00:14:20
implica esto
00:14:21
¿si o no?
00:14:22
¿si? vale, entonces ya se ha dado
00:14:25
de la mano, pero hombre esto sigue
00:14:28
estando mal porque ahora inicio tendría que apuntar a esta
00:14:30
Y entonces lo habríamos acogido al principio, ¿verdad? Lo habríamos acogido al principio. Vale, pues ¿cómo hacemos que inicio ahora ya deje de apuntar a este enlace fuera y empiece a apuntar a esta y entonces ya la lista ya está otra vez construida?
00:14:32
este se ha cogido dentro y ya la lista
00:14:50
es una lista enlazadita
00:14:53
donde hemos metido a este al principio
00:14:55
pues que sentencia tendríamos que hacer
00:14:57
para que inicio ahora a apuntar
00:14:59
a este nodo
00:15:01
que sentencia escribiríais
00:15:02
alguien me la dictaría
00:15:05
para conseguir
00:15:09
que inicio ahora en lugar
00:15:12
de llevarme aquí, me lleve al
00:15:13
nodo que yo acabo de crear
00:15:15
al que yo acabo de crear, a este, que se llama nodo
00:15:17
Que se llama nodo.
00:15:20
¿Qué sentencia pondríais aquí?
00:15:21
Para que esta que es inicio
00:15:28
empiece a apuntar
00:15:31
a esta variable que se llama
00:15:51
nodo, cuya referencia es nodo.
00:15:53
¿Qué sentencia pondríais?
00:15:56
¿Nadie me la dicta?
00:15:58
Piensa lo mejor.
00:16:01
Al revés.
00:16:03
Inicio igual a nodo.
00:16:05
Ya está, ya hemos acabado.
00:16:06
Se acabó el método.
00:16:07
Ya está.
00:16:09
Joder, ¿qué he escrito aquí?
00:16:10
Inicio.
00:16:13
Ya lo tenemos.
00:16:15
Luego son tres partes.
00:16:17
Primero, creamos el nodo y le damos el dato.
00:16:19
Ya está.
00:16:22
Ahora, hacemos que su campo siguiente apunte al principio de la lista.
00:16:23
Y luego cambiamos el principio de la lista para que apunte a este nodo.
00:16:29
Ya está.
00:16:34
Ya hemos agrandado la lista metiéndole dentro un nodo nuevo.
00:16:35
al principio en vez de al final
00:16:39
pero estos son
00:16:41
líneas de código
00:16:43
que no le cuesta nada a la máquina virtual
00:16:46
hacer, nada
00:16:48
y sin embargo lo del array lo rompo
00:16:48
lo parto, copio todo, lo recorro
00:16:51
para copiar, imaginaos que son 20.000
00:16:53
pues es una locura, sin embargo aquí
00:16:55
insertar ha sido sencillísimo
00:16:57
¿vale?
00:16:59
tenemos el método add
00:17:06
ahora ya desde mi main
00:17:07
que yo le meto un hola
00:17:11
pues ese hola
00:17:14
se quedará en la lista
00:17:16
que yo le meto luego un adiós
00:17:19
pues aparecerá otro nodo con ese adiós
00:17:21
y así todos los que yo quiera
00:17:23
vale
00:17:24
o sea, para comprobarlo vamos a hacernos el get
00:17:26
bueno, a ver
00:17:29
lo que pasa es que el get no es tan sencillo
00:17:32
vamos a
00:17:35
primero comprobar que no hay errores de ejecución
00:17:36
no vamos a poder ver nada porque no tenemos la consulta
00:17:40
pero vamos a hacer esta primera ejecución del main
00:17:43
yo me hago mi objeto lista
00:17:46
y le meto cadenas, hola Dios
00:17:47
vamos a ver
00:17:49
que no nos dé error de ejecución al menos
00:17:51
para ver que no hemos programado
00:17:53
algún null pointer exception o algo mal
00:17:55
bueno
00:17:56
al menos no hay errores de ejecución
00:17:59
no se nos ha escapado ninguna burrada
00:18:03
pero hombre, vamos a ver si realmente
00:18:05
vamos a hacer el método get, al menos
00:18:07
vamos a hacer al menos el método get
00:18:09
para poder recuperar los datos por posición
00:18:10
vamos a hacerle el get
00:18:13
este de aquí
00:18:16
para tener ya una estructura de datos operativa
00:18:17
mucho más útil que el array
00:18:20
esto es mucho más útil que un array
00:18:22
vale, pues el get
00:18:23
aquí
00:18:27
el get que me tiene que devolver
00:18:29
el contenido de uno de los nodos
00:18:31
que es de tipo string
00:18:33
y que recibe una posición
00:18:34
vale, este será el get
00:18:37
vale, pues el get no es tan sencillo
00:18:45
porque el get ahora ya implica
00:18:56
la operación de ir avanzando en la lista
00:18:57
de ir avanzando
00:19:00
porque yo tengo la dirección del primero
00:19:02
pero solo tengo la del primero
00:19:04
que está aquí en inicio
00:19:06
está aquí arriba, solo tengo esta
00:19:07
con lo cual
00:19:10
el primer dato lo tengo facilísimo
00:19:11
porque tengo la dirección del primero
00:19:14
que es inicio
00:19:16
entonces si la posición que me dicen es la del primero
00:19:16
es muy sencillo
00:19:20
pero claro, me pueden decir cualquiera
00:19:21
entonces tenemos que saber
00:19:23
avanzar a través del inicio
00:19:25
ir avanzando por la lista hasta pararnos en la que toque.
00:19:27
Bueno, pues esto, el avance en la lista, ¿cómo se hace?
00:19:34
Pues lo que se nos ocurriría es hacer un puntero,
00:19:38
una referencia, perdón, una referencia auxiliar.
00:19:41
Que inicialmente, la inicializamos inicialmente con la del primero.
00:19:45
Vamos a llamarle aux, ¿vale?
00:19:50
Vamos a llamarle aux y la inicializamos.
00:20:06
A ver qué suena.
00:20:11
¿alguien tiene un péndulo por ahí dando la brasa?
00:20:12
a ver, venga
00:20:17
bueno, la del primero ahora mismo es esta
00:20:18
ahí
00:20:23
vale, cogemos una variable auxiliar
00:20:24
y le inicializamos a la del primero
00:20:28
y ahora, le hacemos que esa variable auxiliar
00:20:30
vaya avanzando, vaya avanzando
00:20:33
tantas veces como me diga
00:20:34
posición, tantas veces como me diga
00:20:36
eso será un contador
00:20:38
un contador que cuando ha llegado a posición
00:20:40
nos paramos
00:20:43
y cuando este puntero ya ha ido avanzando
00:20:44
tantas veces como me diga posición
00:20:47
recupero
00:20:49
su campo dato
00:20:50
y ya está
00:20:52
entonces, coger una
00:20:53
referencia auxiliar a nodo e inicializarla
00:20:57
a la primera
00:20:59
eso lo tenemos fácil
00:21:00
me cojo yo
00:21:01
una referencia a nodo auxiliar
00:21:04
y la inicializo
00:21:07
a esto, a inicio
00:21:09
ya tengo la primera parte
00:21:11
tengo esta referencia
00:21:13
anodo auxiliar que está
00:21:15
apuntando al primero de todos
00:21:17
que está apuntando al primero
00:21:18
¿vale?
00:21:21
está apuntando al primero, a este primero
00:21:24
y ahora
00:21:26
antes de meterlo del contador y eso
00:21:28
la sentencia
00:21:31
de avanzarlo para que
00:21:33
apunte al siguiente
00:21:35
¿cuál se os ocurre que podría hacer?
00:21:36
es decir
00:21:39
¿qué sentencia habría que poner aquí
00:21:40
para hacer que aux apunte
00:21:42
al siguiente?
00:21:44
al que está apuntando en ese momento.
00:21:47
aux igual a
00:21:50
¿qué pondríais ahí
00:21:51
para que aux pasara
00:21:53
de apuntar a un nodo al que
00:21:55
esté para apuntar al otro, al que
00:21:57
está consecutivo?
00:21:59
¿qué pondríais ahí?
00:22:01
aux igual a qué?
00:22:03
¿a?
00:22:05
nodo no, aquí no hay nada que se llame nodo.
00:22:08
aux igual a va por ahí pero no
00:22:10
aux igual a qué?
00:22:12
no, a ver, aux
00:22:19
es la dirección de este
00:22:20
que tiene dentro dato y siguiente
00:22:22
aux tiene dentro dato y aux tiene dentro siguiente
00:22:24
que a su vez es la del siguiente
00:22:27
pues para que aux que tiene dentro dato
00:22:29
y tiene dentro siguiente
00:22:33
apunte a su siguiente
00:22:34
sí pero ese t no puede ir suelto
00:22:36
porque es un campo de alguien
00:22:41
tiene que apuntar al siguiente de alguien
00:22:42
sí pero al siguiente de quién
00:22:45
de sí mismo
00:22:46
tiene que apuntar al siguiente de sí mismo
00:22:48
y el siguiente de sí mismo, ¿quién es este?
00:22:50
esta es la sentencia
00:22:54
con la que aux avanza
00:22:55
una posición
00:22:57
con esta sentencia
00:22:58
aux avanza una posición
00:23:10
porque aux.siguiente
00:23:12
es la dirección de su siguiente
00:23:14
pues yo la cojo y le sobrescribo a él
00:23:15
con la de su siguiente
00:23:18
le sobrescribo a él con la de su siguiente
00:23:19
luego con esta, aux avanza en una posición
00:23:21
le sobrescribo a él con la de su siguiente
00:23:24
y ahora ¿cuántas veces hay que hacer eso?
00:23:27
tantas como me indique posición
00:23:30
tengo que hacerlas tantas veces como posición
00:23:31
y cuando ya lo haya avanzado
00:23:34
tantas veces como me diga posición
00:23:37
pues recupero su campo dato
00:23:38
recupero su campo dato
00:23:40
¿vale? entonces esto ya sí que será un bucle
00:23:42
un bucle que podríamos plantearnos así
00:23:44
pues while posición
00:23:47
sea mayor o igual que 0
00:23:49
esto es lo primero que se os ocurriría
00:23:51
ya de programación que lo hemos hecho mil veces
00:23:53
Pues aux igual
00:23:55
Aux, esto
00:23:57
Lo quito de aquí, claro
00:23:59
Aux igual a aux punto
00:24:01
Siguiente
00:24:03
¿Vale?
00:24:05
Y posición
00:24:07
Menos menos
00:24:08
Por ejemplo
00:24:10
Me ahorro contador y me ahorro todo
00:24:12
Esto ya es de programación de toda la vida
00:24:16
Voy decrementando posición
00:24:18
Y mientras no haya llegado a cero
00:24:21
Voy avanzando el puntero
00:24:24
entonces cuando hayamos salido del while
00:24:27
aux ha avanzado
00:24:30
una cantidad de veces
00:24:32
igual a posición
00:24:34
¿si o no?
00:24:35
si ¿no? es un bucle con contador
00:24:38
el papel del contador lo está haciendo aquí posición
00:24:40
lo voy decrementando
00:24:42
y cuando llega a cero
00:24:44
pues ya ha avanzado tantas veces
00:24:45
entonces
00:24:48
cuando ya estoy
00:24:49
con aux
00:24:53
aux ha ido avanzando
00:24:54
avanzado, primero apuntaba a este
00:24:56
luego a este, luego a este
00:24:59
cuando ha avanzado tantas veces
00:25:00
como me dice
00:25:02
posición, ya se queda apuntando
00:25:04
al nodo que yo quiero
00:25:07
y cuando ya está apuntando al nodo
00:25:08
que queremos, lo único que
00:25:10
toca hacer es devolver el
00:25:12
dato, aux.dato
00:25:14
ya está
00:25:21
luego, hacemos un auxiliar
00:25:23
que apunte al primero
00:25:25
lo avanzamos tantas veces como me diga
00:25:26
posición
00:25:29
y cuando ya lo he avanzado
00:25:30
hasta el nodo objetivo
00:25:33
cuando ya ha llegado al nodo objetivo
00:25:34
devuelvo el dato que está
00:25:37
en ese nodo objetivo
00:25:39
y ya está
00:25:40
ya tendría mi get hecho
00:25:43
vale, porque me da
00:25:46
por el public, no le he puesto public
00:26:01
es por eso por lo que me da, ah si, pero no le he puesto public
00:26:03
por eso me da en
00:26:05
vale, pues ya tendría mi primera versión del get
00:26:06
vale, no estamos
00:26:12
verificando si hay casos que no hemos
00:26:22
comprobado errores, lo que sea, no lo estamos
00:26:25
pero vamos a hacer una primera prueba
00:26:27
a ver si me devuelve
00:26:29
¿qué me tendrá que devolver? este
00:26:30
cuando yo ejecute este programa, ¿qué me tendrá
00:26:32
que devolver de cero?
00:26:35
¿hola o adiós? no, adiós
00:26:38
porque mirad que el add
00:26:43
lo hemos hecho en la versión sencilla que
00:26:44
los va insertando al principio
00:26:47
entonces el último que llegó
00:26:49
se ha metido al principio, está haciendo como
00:26:51
una pila, está simulando una pila
00:26:53
¿vale? entonces
00:26:55
el hola
00:26:56
primero será el primero que meterá el hola
00:26:58
luego cuando llegue el adiós
00:27:01
el adiós se colará delante del hola
00:27:02
y así todos
00:27:05
entonces la posición 0 será la del último que se ha metido
00:27:05
la del último
00:27:08
en realidad estamos haciendo una pila
00:27:09
que es un caso concreto de listag
00:27:12
enlazada genérica
00:27:14
pero porque es más fácil de programar que
00:27:15
meterlo al final
00:27:18
vale, vamos a probarlo
00:27:19
a ver si
00:27:23
hacemos nuestro main
00:27:24
vale
00:27:27
Anda, ¿por qué no saca Lola?
00:27:34
Ah, por el mayor o igual
00:27:44
¿Vale?
00:27:45
Pero vamos a meterle más nodos
00:27:46
Para ver mejor
00:27:50
A ver, vamos a poner
00:27:51
Cadena 1
00:27:55
Para ver mejor lo que está haciendo
00:27:59
Solo con estos dos
00:28:00
Control C
00:28:01
Vamos a meterle 4
00:28:05
Cadena 1, cadena 2
00:28:12
Cadena 3, cadena 4
00:28:15
¿Vale?
00:28:18
Entonces él irá emitiendo cadena 4
00:28:19
Luego cadena 3 se colará delante
00:28:22
Luego cadena 2 se colará delante
00:28:23
Y luego cadena 1 se colará delante
00:28:25
¿Vale? O sea, ya sabemos que en nuestra lista
00:28:27
Tal y como hemos hecho el app
00:28:30
Ya sabemos que en nuestra lista está la cadena 1
00:28:31
Cadena 2, cadena 3, cadena 4
00:28:34
Porque el app nos va colando delante
00:28:35
Vale, ahora vamos a probar nuestro get
00:28:37
Con 4 datos que vamos a ver mejor
00:28:39
Lo que está haciendo
00:28:41
Lo probamos
00:28:44
Vale
00:28:46
vale, me está sacando
00:28:48
no me está sacando el primero de todos
00:28:51
vale, me está sacando
00:28:54
cadena 3
00:28:55
entonces, vale
00:28:56
aquí
00:29:02
tendremos que revisar entonces que el
00:29:03
número de avances
00:29:07
no es el correcto
00:29:08
el número de avances no es el correcto
00:29:12
¿qué modificaríais
00:29:13
aquí? es decir, si me
00:29:15
saca el 0, por lo pronto
00:29:20
quitaríamos el igual, porque está avanzando uno de más
00:29:23
entonces vamos a ponernos en el caso extremo
00:29:25
si yo le doy el 0
00:29:27
no tiene que avanzar ni una sola vez
00:29:28
no tiene que avanzar ninguna, ni una sola
00:29:31
¿vale? si yo le doy el 0 no tiene que avanzar ninguna
00:29:33
porque si yo le doy el 0, la posición 0
00:29:35
aux ya está apuntando a la primera
00:29:38
de todas, aux ya está apuntando
00:29:39
a la primera, no tiene que avanzar ninguna
00:29:41
entonces igual se quita, lo que pasa es que
00:29:43
yo esperaba que me hubiera sacado cadena 2
00:29:45
no cadena 3, no sé por qué me ha sacado cadena 3
00:29:47
porque este mayor
00:29:49
igual sí que estaba a propósito
00:29:51
pero no sé por qué me ha sacado cadena 3
00:29:54
vamos a volverlo a probar
00:29:55
ahora, vale
00:29:57
avanzamos y decrementamos
00:29:58
aux.dato
00:30:01
vamos a ver
00:30:05
le meto cadena 1, cadena
00:30:06
2, cadena 3, cadena 4
00:30:09
aminista enlazada y le saco la posición
00:30:10
vale
00:30:13
ahora sí, ah claro, sí, es que estoy al revés
00:30:16
me lo había saco correctamente, perdón, perdón
00:30:20
vale, sí, sí, me tenía que sacar el último
00:30:22
me había hecho yo un lío
00:30:24
antes me sacaba este por el mayor o igual
00:30:26
al haber quitado el igual
00:30:28
ya me saca el 0 que es este
00:30:30
recordad que esta es la posición 0
00:30:32
esta es la 1, esta es la 2 y esta es la 3
00:30:33
porque la última que se mete
00:30:36
se cuela la primera
00:30:40
entonces nuestro get funciona
00:30:41
funciona correctamente
00:30:43
lo único es que
00:30:45
el haber hecho esta versión sencilla
00:30:48
pues hombre, me los está metiendo
00:30:49
de forma antiintuitiva
00:30:51
en lugar de ponérmelos al final
00:30:53
es como si los insertara al principio
00:30:55
pero la estructura de datos me está funcionando
00:30:57
me vale para meter, consultar
00:30:59
borrar cuando hagamos
00:31:02
el método, etc.
00:31:04
Aquí claro, esto se hace muy poco operativo
00:31:06
esto querríamos usarlo como si fuera
00:31:08
un array, que es, oye yo quiero recorrerlo con un for
00:31:10
querríamos poder hacer esto
00:31:12
querríamos poder hacer
00:31:14
un recorrido de este estilo
00:31:16
desde i sea igual a 0
00:31:17
mientras i
00:31:19
sea menor
00:31:22
que
00:31:22
el tamaño de la lista
00:31:24
¿Qué mi lista cómo se llama? Lista. Entonces, hombre, estaría bien tener un método, ojalá tuviéramos un método que me dijera cuántos datos tiene la lista, que me los dijera. Porque si lo tuviéramos, yo podría hacer un recorrido igual que hago con los arrays, ¿verdad?
00:31:27
vale, o sea, si tuviéramos un método
00:31:45
como la propiedad
00:31:58
punto length de los arrays, pues igualito
00:32:01
un método
00:32:03
que me devolviera el tamaño de la lista
00:32:04
podría usarlo exactamente igual
00:32:07
que un array, recorrerlo con
00:32:09
un índice
00:32:10
y consultar cada posición
00:32:11
pero claro, me falta el método
00:32:14
porque yo aquí cuando he hecho la lista
00:32:16
hombre, yo sé que tengo cuatro
00:32:18
pero porque los he metido yo, pero esa lista
00:32:19
puede llegar de otro sitio, puede llegar de otro lado
00:32:22
entonces este método lo necesitamos para poder hacer recorrido
00:32:25
bueno, pues no pasa nada, vamos a programarlo
00:32:27
vamos a programar
00:32:29
un método que nos
00:32:31
da el
00:32:35
tamaño de la lista
00:32:36
vale, pues ¿cómo
00:32:39
programaríais este método? ¿cómo se os ocurre?
00:32:44
lo primero, ¿qué operación
00:32:50
hay que hacer? o sea, que hay
00:32:51
la lista que nos
00:32:56
tiene que devolver
00:32:58
¿cuántos nodos hay? ¿no?
00:32:59
luego, para saber
00:33:03
cuántos hay de algo que hay que hacer?
00:33:04
Contar.
00:33:08
Pues tenemos que contar.
00:33:09
Eso es lo primero de todo.
00:33:10
Pues si tenemos que contar, no hay tutía.
00:33:12
Tendremos que hacer un contador.
00:33:16
Porque lo que tenemos es que contar.
00:33:17
Vale.
00:33:19
¿Y ahora qué tendremos que hacer?
00:33:20
Contar
00:33:23
cuántos avances
00:33:23
necesito
00:33:26
hasta llegar a dónde.
00:33:28
¿Ah?
00:33:33
Bueno,
00:33:35
contar, bueno
00:33:35
los avances salen desde el principio
00:33:37
entonces a dónde llegas al final
00:33:40
entonces ¿cuántos avances hay hasta llegar a
00:33:41
el final de la lista? ¿cuál es?
00:33:44
nul, vale, bueno pues lo mismo
00:33:47
un puntero auxiliar que se
00:33:50
inicializa aquí y lo vamos avanzando
00:33:52
lo vamos avanzando y vamos contando
00:33:53
mientras no haya llegado a nul
00:33:56
mientras no haya llegado a nul
00:33:58
cuando haya llegado a nul, ya ha terminado
00:33:59
entonces
00:34:02
aquí ya simplemente
00:34:05
nos hacemos nuestro nodo auxiliar
00:34:07
que lo inicializamos al principio
00:34:09
y ahora
00:34:13
mientras aux
00:34:15
sea
00:34:17
diferente de null
00:34:19
mientras sea diferente de null
00:34:21
¿qué hacemos?
00:34:23
lo avanzamos
00:34:24
y contamos
00:34:25
aux
00:34:27
igual a aux
00:34:30
punto siguiente
00:34:34
siguiente
00:34:36
¿vale? uy, ¿qué hago yo?
00:34:36
esta es la sentencia
00:34:41
y incrementamos
00:34:42
la cuenta, claro
00:34:44
¿vale? entonces
00:34:45
si aux es null ya desde el principio
00:34:49
si aux es null desde el principio es porque la lista está vacía
00:34:52
¿verdad? la lista está vacía, inicia punta null
00:34:54
está vacía, en ese caso
00:34:56
no entrará en el while nunca
00:34:58
porque aux ya es null
00:35:00
y en ese caso el método también funcionará
00:35:01
porque entonces me devolverá cont que es 0
00:35:04
¿vale? que aux
00:35:06
no es null, significa que al menos
00:35:10
hay un nodo, pues ahí empezamos
00:35:12
a avanzar, y ya mi
00:35:14
bucle va avanzando, mientras
00:35:16
aux sea diferente de null
00:35:18
avánzalo y cuenta
00:35:19
sigue siendo aux diferente de null
00:35:22
avánzalo y cuenta
00:35:24
y así
00:35:26
todo el rato
00:35:28
vale, bueno, parece que esto tiene sentido
00:35:29
vamos a probarlo, porque aquí nos pueden haber fallado los extremos
00:35:32
uy, cuidado que es una más, una menos
00:35:34
lo más cómodo aquí es
00:35:36
probarlo, vamos a, ah, yo lo he llamado
00:35:38
de nuevo no le he puesto el public
00:35:41
y además
00:35:43
lo he llamado lista en vez de size
00:35:45
ahora sí
00:35:47
¿vale? este método, ahora el tamaño
00:35:52
¿vale? pues
00:35:55
ahora ya sí
00:35:58
tengo mi método size, aparentemente bien
00:36:02
hecho, y ya puedo recorrer
00:36:06
con mi bucle for, como recorro
00:36:08
la raíz, exactamente igual con mi bucle for
00:36:10
desde cero, mientras sea menor que
00:36:12
el total de elementos de la lista
00:36:14
incrementando uno, muéstrame
00:36:16
el contenido uno por uno, que lo sacas con getE.
00:36:18
Vamos a ver
00:36:22
si nos saca, nos tendrá que sacar
00:36:22
cadena 4, cadena 3, cadena 2, cadena 1.
00:36:24
Si es que lo hemos hecho bien todo.
00:36:27
Vamos a ver.
00:36:30
Vale, pues ahí los tenemos.
00:36:34
Vale, entonces esto funciona
00:36:37
como un array.
00:36:38
Pero mucho más
00:36:41
computacionalmente, infinitamente
00:36:42
más eficiente.
00:36:44
Aquí no estamos usando arrays por
00:36:46
ningún lado, no los estamos usando
00:36:48
y
00:36:50
el efecto es
00:36:52
estar usando efectivamente una estructura
00:36:54
en la que yo meto, saco o no
00:36:56
porque no le hemos programado el método de sacar, que es un poquito
00:36:58
más complicado, recupero
00:37:00
por posición, etcétera
00:37:02
vale, entonces aquí claro, para
00:37:09
uno hacerse ya su estructura estupenda
00:37:10
pues hombre, habría cosas
00:37:12
que, pues podría hacer
00:37:15
un remove por posición
00:37:18
pues un remove por posición
00:37:19
que tú le das una posición
00:37:22
y te devuelve
00:37:24
o sea, te lo elimina
00:37:28
de la lista
00:37:31
podríamos eliminar por contenido
00:37:32
también, donde tú le
00:37:36
pasas un dato
00:37:42
y te elimina
00:37:45
el nodo o todos los nodos
00:37:47
depende de la versión que tú quieras hacer
00:37:49
que contienen este dato
00:37:51
es una versión de remove distinta a la de arriba
00:37:53
aquí estaríamos haciendo un remove
00:37:55
sobrecargado, ¿vale?
00:37:57
recordad que lo que era la sobrecarga
00:37:59
de métodos, que eran métodos
00:38:01
que se llaman igual pero son
00:38:03
perfectamente distinguibles porque sus parámetros
00:38:05
son distintos
00:38:07
aquí este remove no se puede
00:38:08
confundir con este otro
00:38:11
porque a ese se le pasa un int y a ese se le pasa un string
00:38:13
pues podríamos hacer esto
00:38:15
¿vale? podríamos hacer
00:38:17
este en realidad
00:38:20
add, si lo hubiéramos
00:38:22
llamado bien, lo tendríamos
00:38:24
que haber llamado addFirst porque es añádelo
00:38:26
pero al principio, añádelo al principio
00:38:28
con lo cual esto que estamos haciendo aquí
00:38:30
sería este
00:38:33
sería este un nombre
00:38:35
un poco más claro
00:38:39
vale, bueno pues además
00:38:40
del añade al principio
00:38:50
esto se quedaría, esta estructura ya de datos
00:38:51
se quedaría estupenda si le añadimos un método
00:38:54
que sea añadir al final
00:38:56
el otro
00:39:00
añadir al final
00:39:02
public void
00:39:03
y ya si que se quedaría
00:39:13
completísima y divina
00:39:16
si le añadimos un
00:39:18
método que sea añadir
00:39:20
en la posición que yo te diga
00:39:22
no al principio y al final, sino añadir en la que yo te diga
00:39:24
eso ya sí que
00:39:27
sería estupendo
00:39:28
una versión de app que tú le pasas el dato
00:39:29
tú le pasas el dato
00:39:33
y le pasas una posición
00:39:40
y te lo añade
00:39:42
insertado en la posición
00:39:47
que tú le digas, por ejemplo
00:39:49
vale, así
00:39:50
aquí podríamos programar esto
00:39:52
ya más completito
00:39:54
y ya con mi main
00:39:55
yo uso esta lista
00:39:57
y no tengo ni idea de cómo está hecha por dentro
00:40:00
ni me importa, yo llamo a sus métodos
00:40:02
llamo a los métodos de añadir
00:40:04
al principio, recorrer con el
00:40:06
índice, recuperar
00:40:08
por posición, ahora quiero añadir al final
00:40:10
pues atlas, ahora quiero borrar
00:40:12
pues quiero borrar el
00:40:14
de posición, lo que sea
00:40:15
pues llamo a
00:40:18
venga, ya está
00:40:20
a borrar el de posición 1, por ejemplo
00:40:21
lo que yo quiera, ahora mismo no me haría nada
00:40:24
porque el método está vacío
00:40:26
claro, el método está vacío y no me haría nada
00:40:27
pero yo podría completar toda esta funcionalidad
00:40:29
y con lo que hemos visto
00:40:32
lo podéis hacer perfectamente
00:40:36
porque es lo mismo que yo he hecho
00:40:38
parecido, se basa en combinar
00:40:40
la sentencia de avanzar con punteros auxiliares
00:40:42
y ya está
00:40:45
borrar por posición
00:40:46
¿cómo sería?
00:40:49
pues borrar por posición es un poco más complicado
00:40:51
porque de nuevo es un puntero auxiliar
00:40:53
que tienes que avanzar hasta la posición
00:40:55
y cuando ya has llegado
00:40:57
tienes que sobre, si este es el que
00:40:58
hay que eliminar
00:41:01
pues eliminar será puentearle
00:41:03
al anterior
00:41:05
asignarle la dirección de este
00:41:06
así, y lo puenteas
00:41:09
al apuenteado, eso será eliminar
00:41:12
con un auxiliar llegar hasta el que quieras borrar
00:41:13
y
00:41:16
luego a este puntero
00:41:17
darle su siguiente
00:41:19
darle su siguiente, asignárselo
00:41:20
pues lo ha esponteado
00:41:22
entonces no es
00:41:24
difícil de programar, lo podéis hacer
00:41:26
el de añadir al final
00:41:28
añadir al final, habrá que hacer de nuevo
00:41:30
un puntero auxiliar
00:41:33
o sea, la parte de añadir, habrá que crear un nodo
00:41:33
eso está claro, un nodo como aquí
00:41:37
en el añadir al principio, un nodo y darle el dato
00:41:38
pero luego ya
00:41:41
habrá que con un auxiliar
00:41:43
navegar hasta el final
00:41:44
y cuando ya ha llegado al final, a este
00:41:45
a este ya darle la dirección
00:41:48
del nuevo.
00:41:52
Una sentencia de asignación, nada más.
00:41:53
Nada más.
00:41:56
Bueno, pues yo querría que hicierais
00:41:58
estos métodos que faltan.
00:42:00
¿Vale? Queréis estos métodos
00:42:02
que faltan. Bueno, pues esta
00:42:04
estructura de datos ya existe, ya está hecha.
00:42:11
Y está hecha como la hemos hecho
00:42:13
nosotros. Punto pelota.
00:42:15
¿Vale? Se llama de otra manera, pero
00:42:17
ya está hecha.
00:42:19
Esta en particular se llama Linked List
00:42:20
o en lista enlazada en inglés, nos da lo mismo
00:42:22
vale
00:42:24
bueno, a ver
00:42:26
enteraos todo el mundo
00:42:29
¿lo pilláis? ¿cogido?
00:42:31
bueno, cuando
00:42:37
al menos tratad de hacer
00:42:38
alguno de los cuatro
00:42:41
con que alguno de los cuatro
00:42:45
los hagáis
00:42:47
vosotros ya
00:42:48
os va a ser suficiente
00:42:50
para entender del todo lo que hemos hecho arriba
00:42:52
con que alguno de los 4 ya lo hagáis votos de 0
00:42:55
este get por ejemplo
00:42:57
se ha quedado
00:43:00
no le he verificado errores
00:43:03
imagínate que le damos una posición
00:43:06
mayor
00:43:07
que la que existe
00:43:09
por ejemplo imaginaos que en este main de aquí
00:43:10
en este main
00:43:13
yo digo
00:43:15
yo tengo solo 4 y de repente digo
00:43:16
recupérame las 7
00:43:19
que creéis que va a salir aquí abajo
00:43:20
justo
00:43:22
efectivamente me va a salir
00:43:25
un null pointer exception, ¿por qué?
00:43:27
porque
00:43:30
este va a estar avanzando, va a estar avanzando
00:43:31
la lista se va a acabar
00:43:36
y esto va a ser null
00:43:38
y va a tratar de hacer un siguiente de algo que ya es null
00:43:40
porque ya ha terminado
00:43:43
la lista
00:43:45
y entonces aquí cuando trate de hacer
00:43:45
un acceso a siguiente de algo que es null
00:43:48
va a decir null pointer exception
00:43:51
entonces hombre, este método get
00:43:52
se quedaría mucho mejor si decimos
00:43:54
Oye, si la posición que me pasas es mayor que el tamaño, retún, retún nul, devuélveme nul porque no tienes nada. No, o sea, esto, si yo le pongo aquí esto, sería mucho mejor.
00:43:56
si la posición que me pasas
00:44:06
resulta que es mayor
00:44:09
que
00:44:11
el tamaño de la lista
00:44:13
y afortunadamente tengo el método
00:44:15
size que me lo dice
00:44:17
en ese caso
00:44:18
si la posición
00:44:20
es mayor que el tamaño de la lista
00:44:23
pues en ese caso mira
00:44:26
fuera
00:44:27
return null
00:44:29
devuélveme el contenido
00:44:31
string que sea null
00:44:33
entonces esto mayor o mayor que menos 1
00:44:34
porque
00:44:38
10.6 y la lista tiene
00:44:39
4
00:44:42
10.6 es 4
00:44:43
y posición solamente tiene que ser
00:44:45
0, 1, 2 o 3, con lo cual esto sería mayor o igual
00:44:48
¿verdad?
00:44:50
si posición es mayor o igual que 6
00:44:51
entonces esa posición no existe
00:44:53
porque solo existen desde 0 hasta 6 menos 1
00:44:56
solo existen desde 0 hasta 6 menos 1
00:44:58
entonces si es mayor o igual
00:45:01
lo siento
00:45:03
Entonces ahora ya
00:45:04
Si ejecutamos este main
00:45:07
Aquí no voy a dar null pointer exceptio
00:45:09
Me va a mostrar null porque ese valor tiene null
00:45:12
Claro, pero no me va a dar null pointer exceptio
00:45:14
Me va a decir, hay null
00:45:16
En la posición 7 hay null, no hay nada
00:45:17
Vale
00:45:19
Bueno
00:45:21
Vamos a parar aquí un segundin
00:45:30
¿Vale?
00:45:33
Venga, pues
00:45:37
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 8
- Fecha:
- 26 de febrero de 2024 - 18:48
- Visibilidad:
- Público
- Centro:
- IES ROSA CHACEL
- Duración:
- 45′ 38″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 188.27 MBytes