Volver a los desafíos
Fácil 0 resueltos 0% de aceptación

Operaciones en una lista enlazada

Simula una lista enlazada: añade en ambos extremos, elimina al principio o por valor, e inviértela.

Lo que aprenderás

  • Añadir y quitar nodos en ambos extremos
  • Quitar el primer nodo con un valor dado
  • Invertir el orden de una lista

Problema

Ver original (inglés)

Una lista enlazada guarda los valores en nodos que apuntan al siguiente, así que añadir o quitar al principio es barato. Simula una que empieza vacía.

Procesa las operaciones en orden:

  • push_front x: añade x al principio.
  • push_back x: añade x al final.
  • pop_front: elimina el primer valor (se ignora si la lista está vacía).
  • remove x: elimina el primer nodo con valor x, si existe.
  • reverse: invierte el orden de los nodos.

Implementa linked_list_operations(operations).

Entrada

operations: Las operaciones.

Salida

Devuelve los valores de la lista del principio al final.

Restricciones

0 ≤ número de operaciones ≤ 10,000

−10^9 ≤ x ≤ 10^9

Ejemplos

Ejemplo 1
Entrada:
operations = ["push_back 2", "push_front 1", "push_back 3", "reverse"]

Salida esperada:
expected = [3, 2, 1]
Entrada:
std::vector<std::string> operations = {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Salida esperada:
std::vector<long long> expected = {3, 2, 1};
Entrada:
string[] operations = new string[] {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Salida esperada:
long[] expected = new long[] {3, 2, 1};

Explicación

La lista queda 1 → 2 → 3, y al invertirla da [3, 2, 1].

Ejemplo 2
Entrada:
operations = ["push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"]

Salida esperada:
expected = [5]
Entrada:
std::vector<std::string> operations = {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Salida esperada:
std::vector<long long> expected = {5};
Entrada:
string[] operations = new string[] {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Salida esperada:
long[] expected = new long[] {5};

Explicación

remove solo quita el primer 5 y queda 7 → 5; luego pop_front quita el 7: [5].

Cómo abordarlo

Inténtalo primero por tu cuenta y luego abre las pistas una a una.

Pista 1

Un tipo de lista con inserción barata en ambos extremos (std::list, LinkedList<T>, deque) hace casi todo el trabajo.

Pista 2

remove borra solo la primera coincidencia, y pop_front sobre una lista vacía no hace nada.

Pista 3

Al invertir, el otro extremo pasa a ser el principio para los push y pop siguientes.

Complejidad esperada

tiempo O(n²), espacio extra O(n)

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.