Voltar para os desafios
Fácil 0 resolvidos 0% de aceitação

Operações em uma lista ligada

Simule uma lista ligada: adicione nas duas pontas, remova do início ou por valor e inverta.

O que você vai aprender

  • Adicionar e remover nós nas duas pontas
  • Remover o primeiro nó com um valor dado
  • Inverter a ordem de uma lista

Problema

Ver original (inglês)

Uma lista ligada guarda valores em nós que apontam para o próximo, então adicionar ou remover no início é barato. Simule uma que começa vazia.

Processe as operações em ordem:

  • push_front x: adiciona x no início.
  • push_back x: adiciona x no fim.
  • pop_front: remove o primeiro valor (ignorado se a lista estiver vazia).
  • remove x: remove o primeiro nó com valor x, se existir.
  • reverse: inverte a ordem dos nós.

Implemente linked_list_operations(operations).

Entrada

operations: As operações.

Saída

Retorne os valores da lista do início ao fim.

Restrições

0 ≤ número de operações ≤ 10,000

−10^9 ≤ x ≤ 10^9

Exemplos

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

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

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

Saída esperada:
long[] expected = new long[] {3, 2, 1};

Explicação

A lista vira 1 → 2 → 3, e invertê-la dá [3, 2, 1].

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

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

Saída 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"};

Saída esperada:
long[] expected = new long[] {5};

Explicação

remove tira só o primeiro 5 e sobra 7 → 5; depois pop_front tira o 7: [5].

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Um tipo de lista com inserção barata nas duas pontas (std::list, LinkedList<T>, deque) faz quase todo o trabalho.

Dica 2

remove apaga só a primeira ocorrência, e pop_front em lista vazia não faz nada.

Dica 3

Depois de inverter, a outra ponta passa a ser o início para os próximos push e pop.

Complexidade esperada

tempo O(n²), espaço extra O(n)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.