Ejercicios propuestos por tema
Nodos y Punteros
Reto 1: Crear una estructura básica de nodo
Nivel: Básico
Tiempo estimado de resolución: 25 minutos
Participantes: Individual
Enunciado: Implementa una clase Node
que contenga un valor entero y una referencia (next
) al siguiente nodo. Luego, crea manualmente una cadena de 3 nodos y recorre la lista mostrando los valores.
Resultado esperado:
Valores en la lista: 10 -> 20 -> 30
Pistas o ayudas:
- Define la clase
Node
con atributosdata
ynext
. - Usa referencias (
next
) para conectar los nodos. - Un while es ideal para recorrer la lista.
Lista Enlazada Simple
Reto 1: Construcción básica de una lista enlazada simple
Nivel: Básico
Tiempo estimado de resolución: 25 minutos
Participantes: Individual
Enunciado: Crea una clase Node
con atributos data
(entero) y next
. Luego, crea una clase SimpleLinkedList
que tenga un atributo head
(cabeza de la lista). Implementa un método addAtEnd(int data)
que inserte un nodo al final de la lista y un método printList()
que muestre todos los elementos.
Resultado esperado:
Lista: 5 -> 10 -> 15 -> null
Pistas o ayudas:
- Si
head
esnull
, el nuevo nodo será la cabeza. - Usa un puntero temporal para recorrer hasta el último nodo.
Reto 2: Insertar al inicio y eliminar el primero
Nivel: Básico
Tiempo estimado de resolución: 30 minutos
Participantes: En parejas
Enunciado: Usando la clase del reto anterior, implementa dos métodos adicionales:
addAtBeginning(int data)
que inserte un nodo al inicio.deleteFirst()
que elimine el primer nodo de la lista.
Resultado esperado:
Insertando al inicio: 20 -> 5 -> 10 -> 15 -> null
Eliminando el primero: 5 -> 10 -> 15 -> null
Pistas o ayudas:
- Al insertar al inicio, el nuevo nodo apunta al
head
y luego se actualizahead
. - Para eliminar el primero, actualiza
head = head.next
.
Reto 3: Buscar un elemento
Nivel: Medio
Tiempo estimado de resolución: 35 minutos
Participantes: Individual
Enunciado: Agrega un método search(int value)
que recorra la lista y devuelva true
si el valor existe, o false
si no está presente.
Resultado esperado:
Lista: 3 -> 6 -> 9 -> null
Buscar 6: Encontrado
Buscar 10: No encontrado
Pistas o ayudas:
- Usa un puntero temporal para recorrer nodo por nodo.
- Si el valor es encontrado, retorna
true
inmediatamente.
Reto 4: Insertar en una posición específica
Nivel: Medio
Tiempo estimado de resolución: 50 minutos
Participantes: En grupo (máx. 3 personas)
Enunciado: Implementa el método insertAtPosition(int data, int position)
que inserte un nodo en la posición indicada (0 es el inicio). Si la posición no existe, debe mostrar un mensaje de error.
Resultado esperado:
Lista inicial: 1 -> 2 -> 4 -> null
Insertar en posición 2 (dato 3): 1 -> 2 -> 3 -> 4 -> null
Pistas o ayudas:
- Usa un contador para recorrer hasta el nodo anterior a la posición.
- Considera el caso cuando la posición es 0 (usar
addAtBeginning
).
Reto 5: Eliminar por valor
Nivel: Avanzado
Tiempo estimado de resolución: 70 minutos
Participantes: En parejas
Enunciado: Crea un método deleteByValue(int value)
que elimine el primer nodo que contenga el valor dado. Si el valor no existe, debe mostrar un mensaje de error.
Resultado esperado:
Lista inicial: 5 -> 7 -> 9 -> 7 -> null
Eliminar 7: 5 -> 9 -> 7 -> null
Eliminar 10: Valor no encontrado
Pistas o ayudas:
- Si el nodo a eliminar es
head
, actualiza la cabeza. - Usa dos punteros: uno para el nodo actual y otro para el anterior.
Lista Enlazada Doble
Reto 1: Construcción básica de una lista doblemente enlazada
Nivel: Básico
Tiempo estimado de resolución: 30 minutos
Participantes: Individual
Enunciado: Crea una clase DoublyNode
con atributos data
, next
y prev
. Luego, crea una clase DoublyLinkedList
con un atributo head
. Implementa un método addAtEnd(int data)
que inserte nodos al final y un método printForward()
que muestre los elementos de izquierda a derecha.
Resultado esperado:
Lista: 10 <-> 20 <-> 30 <-> null
Pistas o ayudas:
- Si la lista está vacía, el nodo se convierte en la cabeza.
- Usa un puntero temporal para encontrar el último nodo.
- Actualiza el
prev
del nuevo nodo al conectarlo.
Reto 2: Recorrer en ambos sentidos
Nivel: Básico
Tiempo estimado de resolución: 35 minutos
Participantes: En parejas
Enunciado: Agrega a la clase DoublyLinkedList
el método printBackward()
que muestre los elementos desde el último hasta el primero.
Resultado esperado:
Lista (adelante): 10 <-> 20 <-> 30 <-> null
Lista (atrás): 30 <-> 20 <-> 10 <-> null
Pistas o ayudas:
- Recorre la lista hasta el último nodo con un puntero.
- Luego usa el puntero
prev
para regresar nodo a nodo.
Reto 3: Insertar al inicio y al final
Nivel: Medio
Tiempo estimado de resolución: 45 minutos
Participantes: Individual
Enunciado: Implementa los métodos addAtBeginning(int data)
y addAtEnd(int data)
para insertar nodos en cualquiera de los extremos.
Resultado esperado:
Insertando al inicio: 5 <-> 10 <-> 20 <-> 30 <-> null
Insertando al final: 5 <-> 10 <-> 20 <-> 30 <-> 40 <-> null
Pistas o ayudas:
- Al insertar al inicio, el nuevo nodo apunta a la cabeza actual y se actualiza el
prev
de la cabeza. - Al insertar al final, actualiza el
next
del último nodo y elprev
del nuevo nodo.
Listas Enlazada Circular Simple
Reto 1: Resolver el problema de Josephus
Nivel: Avanzado
Tiempo estimado de resolución: 90 minutos
Participantes: En parejas
Enunciado: Usando la lista circular, implementa el problema de Josephus: en un grupo de n
personas numeradas, se elimina cada k
-ésima persona hasta que solo quede una.
Resultado esperado:
Personas: 1 -> 2 -> 3 -> 4 -> 5 -> (regresa a 1)
k = 3
Personas tras eliminaciones:
Personas: 1 -> 2 -> 4 -> 5 (se elimina al 3, continua desde el 4)
Personas: 2 -> 4 -> 5 (se elimina al 1, continua desde el 2)
Personas: 2 -> 4 (se elimina al 5, continua desde el 2)
Personas: 4 (se elimina al 2, continua desde el 4)
Persona sobreviviente: 4
Personas: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 -> (regresa a 1)
k = 6
Personas tras eliminaciones:
Personas: 1 -> 2 -> 3 -> 4 -> 5 -> 7 -> 8 -> 9 -> 10 -> 11 -> 12 (se elimina al 6, continua desde el 7)
Personas: 1 -> 2 -> 3 -> 4 -> 5 -> 7 -> 8 -> 9 -> 10 -> 11 (se elimina al 12, continua desde el 1)
Personas: 1 -> 2 -> 3 -> 4 -> 5 -> 8 -> 9 -> 10 -> 11 (se elimina al 7, continua desde el 8)
Personas: 1 -> 3 -> 4 -> 5 -> 8 -> 9 -> 10 -> 11 (se elimina al 2, continua desde el 3)
Personas: 1 -> 3 -> 4 -> 5 -> 8 -> 9 -> 11 (se elimina al 10, continua desde el 11)
Personas: 1 -> 3 -> 4 -> 5 -> 9 -> 11 (se elimina al 8, continua desde el 9)
Personas: 1 -> 3 -> 4 -> 9 -> 11 (se elimina al 5, continua desde el 9)
Personas: 1 -> 3 -> 4 -> 11 (se elimina al 9, continua desde el 11)
Personas: 3 -> 4 -> 11 (se elimina al 1, continua desde el 3)
Personas: 3 -> 4 (se elimina al 11, continua desde el 3)
Personas: 3 (se elimina al 4, continua desde el 3)
Persona sobreviviente: 3
Pistas o ayudas:
- Usa la lista circular para avanzar
k
posiciones y eliminar el nodo actual. - Repite el proceso hasta que solo quede un nodo en la lista.
Lista Enlazada Circular Doble
Reto 1: Simular un sistema de turnos
Nivel: Avanzado
Tiempo estimado de resolución: 90 minutos
Participantes: En parejas
Enunciado: Usando la lista doblemente circular, crea un sistema que permita registrar personas en una fila de turnos y avanzar al siguiente o anterior turno en cualquier momento. Debe incluir métodos para:
- Registrar una persona al final de la lista.
- Avanzar al siguiente turno (
next
). - Retroceder al turno anterior (
prev
). - Mostrar el turno actual.
Resultado esperado:
Personas: Ana <-> Luis <-> Marta <-> (regresa a Ana)
Turno actual: Ana
Siguiente turno: Luis
Siguiente turno: Marta
Anterior turno: Luis
Pistas o ayudas:
- Usa un puntero
current
para mantener el turno actual. - Aprovecha los punteros
next
yprev
para moverte entre los turnos.
Stack (Pilas): LIFO, implementación con arrays y listas enlazadas
Reto 1: Validar paréntesis balanceados
Nivel: Básico
Tiempo estimado de resolución: 35 minutos
Participantes: En parejas
Enunciado: Usando la clase StackArray
, implementa un método isBalanced(String expression)
que verifique si una cadena de paréntesis ()
, llaves {}
y corchetes []
está balanceada.
Resultado esperado:
Expresión: "{[()]}" -> Balanceada
Expresión: "{[(])}" -> No balanceada
Pistas o ayudas:
- Inserta caracteres de apertura en la pila.
- Cuando encuentres un cierre, verifica si coincide con el elemento en la cima.
Reto 2: Deshacer y rehacer (Undo/Redo)
Nivel: Medio
Tiempo estimado de resolución: 60 minutos
Participantes: En grupo (máx. 3 personas)
Enunciado: Simula un sistema de edición de texto con dos pilas:
- Una pila
undo
que almacene las acciones realizadas. - Una pila
redo
que almacene las acciones deshechas.
Debes permitir:
- Escribir texto.
- Deshacer la última acción (
undo
). - Rehacer la última acción (
redo
).
Resultado esperado:
Texto: "Hola"
Undo -> Texto: ""
Redo -> Texto: "Hola"
Pistas o ayudas:
- Cada acción puede representarse como una cadena con el texto agregado o eliminado.
- Usa dos instancias de la pila para controlar las operaciones.
Reto 3: Evaluar expresiones en notación postfija (RPN)
Nivel: Avanzado
Tiempo estimado de resolución: 90 minutos
Participantes: En parejas
Enunciado: Usando una pila, implementa un método evaluateRPN(String expression)
que evalúe expresiones en notación postfija.
Ejemplo:
Expresión: "5 1 2 + 4 * + 3 -"
Resultado: 14
Expresión: "40 15 + 33 11 - 22 / 3 + *"
Resultado: 220
Pistas o ayudas:
- Recorre la expresión por tokens.
- Si el token es un número, haz
push
. - Si es un operador, haz
pop
de los dos últimos valores, evalúa y hazpush
del resultado.
Queue (Colas): FIFO, variantes (colas dobles, de prioridad)
Reto 1: Simular una fila de atención al cliente
Nivel: Medio
Tiempo estimado de resolución: 50 minutos
Participantes: Individual
Enunciado: Simula una fila de atención al cliente usando la clase QueueLinkedList
. Cada cliente tiene un nombre y un número de turno. Debes permitir:
- Registrar un cliente (
enqueue
). - Atender un cliente (
dequeue
). - Mostrar el siguiente cliente en ser atendido.
Resultado esperado:
Clientes en fila: Ana -> Luis -> Marta
Atendiendo a: Ana
Siguiente cliente: Luis
Pistas o ayudas:
- Crea una clase
Cliente
con atributosnombre
yturno
. - Al hacer
dequeue
, muestra el cliente atendido.
Reto 2: Cola de prioridad básica
Nivel: Medio
Tiempo estimado de resolución: 60 minutos
Participantes: En grupo (máx. 3 personas)
Enunciado: Crea una clase PriorityQueue
que inserte elementos en función de su prioridad (entero). Los elementos con mayor prioridad deben salir primero al hacer dequeue()
.
Resultado esperado:
Insertando: (Ana, 2), (Luis, 5), (Marta, 1)
dequeue() -> Luis (prioridad 5)
dequeue() -> Ana (prioridad 2)
Pistas o ayudas:
- Al insertar, coloca el nuevo elemento en la posición correcta según su prioridad.
- Considera usar un
ArrayList
o un arreglo redimensionable.
Reto 3: Cola doble (Deque)
Nivel: Avanzado
Tiempo estimado de resolución: 90 minutos
Participantes: En parejas
Enunciado: Crea una clase Deque
que permita insertar y eliminar elementos tanto al inicio como al final de la cola. Debe contener los métodos:
addFirst(int data)
yaddLast(int data)
.removeFirst()
yremoveLast()
.peekFirst()
ypeekLast()
.
Resultado esperado:
Cola: 2 <-> 4 <-> 6
removeFirst() -> 2
removeLast() -> 6
Pistas o ayudas:
- Puedes implementar esta estructura con nodos dobles (
prev
ynext
). - Si se usan arreglos, considera el comportamiento circular.