Retour aux défis
Facile 0 résolus 0 % de réussite

Opérations sur une liste chaînée

Simulez une liste chaînée : ajout aux deux bouts, suppression en tête ou par valeur, et inversion.

Ce que vous allez apprendre

  • Ajouter et retirer des nœuds aux deux bouts
  • Retirer le premier nœud d'une valeur donnée
  • Inverser l'ordre d'une liste

Problème

Une liste chaînée stocke les valeurs dans des nœuds qui pointent vers le suivant, donc ajouter ou retirer en tête coûte peu. Simulez une liste qui commence vide.

Traitez les opérations dans l'ordre :

  • push_front x: ajoute x en tête.
  • push_back x: ajoute x en queue.
  • pop_front: retire la première valeur (ignoré si la liste est vide).
  • remove x: retire le premier nœud de valeur x, s'il existe.
  • reverse: inverse l'ordre des nœuds.

Implémentez linked_list_operations(operations).

Entrée

operations: Les opérations.

Sortie

Renvoyez les valeurs de la liste de la tête à la queue.

Contraintes

0 ≤ nombre d'opérations ≤ 10,000

−10^9 ≤ x ≤ 10^9

Exemples

Exemple 1
Entrée :
operations = ["push_back 2", "push_front 1", "push_back 3", "reverse"]

Sortie attendue :
expected = [3, 2, 1]
Entrée :
std::vector<std::string> operations = {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Sortie attendue :
std::vector<long long> expected = {3, 2, 1};
Entrée :
string[] operations = new string[] {"push_back 2", "push_front 1", "push_back 3", "reverse"};

Sortie attendue :
long[] expected = new long[] {3, 2, 1};

Explication

La liste devient 1 → 2 → 3, et l'inverser donne [3, 2, 1].

Exemple 2
Entrée :
operations = ["push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"]

Sortie attendue :
expected = [5]
Entrée :
std::vector<std::string> operations = {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Sortie attendue :
std::vector<long long> expected = {5};
Entrée :
string[] operations = new string[] {"push_back 5", "push_back 7", "push_back 5", "remove 5", "pop_front"};

Sortie attendue :
long[] expected = new long[] {5};

Explication

remove ne retire que le premier 5, il reste 7 → 5 ; pop_front retire ensuite 7 : [5].

Comment l'aborder

Essayez d'abord seul, puis ouvrez les indices un par un.

Indice 1

Un type de liste avec insertion rapide aux deux bouts (std::list, LinkedList<T>, deque) fait l'essentiel du travail.

Indice 2

remove ne supprime que la première correspondance, et pop_front sur une liste vide ne fait rien.

Indice 3

Après une inversion, l'autre bout devient la tête pour les push et pop suivants.

Complexité attendue

temps O(n²), espace supplémentaire O(n)

Références

Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.