💻francais

NSI : les 3 erreurs fréquentes sur les listes chaînées

25 août 2026 7 min de lecture

Les listes chaînées sont une notion clé en NSI, surtout en Terminale. Elles représentent une structure linéaire où chaque élément est relié au suivant par une référence. Beaucoup d'élèves se heurtent à des pièges classiques qui peuvent coûter des points au bac. Dans cet article, on va décortiquer ensemble les 3 erreurs les plus fréquentes, avec des explications simples et des exemples de code Python pour que tu les évites à ton tour. Prêt·e ? C'est parti !

Comprendre les listes chaînées en NSI

Avant de parler des erreurs, assure-toi de bien comprendre ce qu'est une liste chaînée. Contrairement à un tableau (ou liste Python classique), une liste chaînée est une structure linéaire où chaque élément, appelé nœud, contient une valeur et une référence vers le nœud suivant. Le dernier nœud pointe vers None (ou null).

En Python, on peut modéliser un nœud avec une classe :

class Noeud:
    def __init__(self, valeur):
        self.valeur = valeur
        self.suivant = None

Puis créer une liste chaînée en reliant les nœuds :

n1 = Noeud(5)
n2 = Noeud(3)
n3 = Noeud(8)
n1.suivant = n2
n2.suivant = n3

Ici, n1 est la tête de liste. On peut parcourir la liste en suivant les références. C'est une structure dynamique qui permet d'insérer ou supprimer des éléments sans décaler tout le reste, contrairement aux tableaux.

Erreur n°1 : Perdre la tête de la liste

La première erreur, et pas des moindres, c'est de perdre la référence au premier nœud. Si tu modifies la variable qui pointe vers la tête sans la conserver, tu perds tout l'accès à la liste. Par exemple, si tu écris :

tete = n1
tete = tete.suivant  # On avance, mais on a perdu n1 !

Après cette opération, la variable tete pointe vers n2, et tu ne peux plus accéder à n1. C'est grave si tu avais besoin de parcourir la liste depuis le début.

Comment éviter cette erreur ?

Utilise une variable séparée pour parcourir la liste, par exemple courant, et garde tete intacte :

courant = tete
while courant is not None:
    print(courant.valeur)
    courant = courant.suivant

De même, quand tu insères un élément en tête, pense à mettre à jour la tête :

def insertion_tete(tete, valeur):
    nouveau = Noeud(valeur)
    nouveau.suivant = tete
    return nouveau  # nouvelle tête

Ici, la fonction retourne le nouveau nœud, et tu dois l'affecter à ta variable tete : tete = insertion_tete(tete, 10). C'est un réflexe à avoir.

Erreur n°2 : Confondre récursivité et itération sur une liste chaînée

Les listes chaînées se prêtent naturellement à la récursivité, car chaque nœud pointe vers une sous-liste. Mais beaucoup d'élèves se mélangent entre la version récursive et la version itérative, ou écrivent des fonctions récursives infinies. Par exemple, pour calculer la longueur, on peut faire :

def longueur_iterative(tete):
    compteur = 0
    courant = tete
    while courant is not None:
        compteur += 1
        courant = courant.suivant
    return compteur

Et en version récursive :

def longueur_recursive(tete):
    if tete is None:
        return 0
    else:
        return 1 + longueur_recursive(tete.suivant)

Les deux sont correctes, mais il faut bien comprendre le cas de base. Un oubli du cas de base (tête vide) mène à une récursion infinie. De plus, ne mélange pas les deux approches dans une même fonction, ça devient vite illisible.

Comment éviter cette erreur ?

Entraîne-toi à écrire les deux versions pour les opérations classiques : recherche, longueur, affichage. Bien connaître les deux formes t'aidera à choisir la plus adaptée selon le contexte. Pour le bac, sache que la récursivité est souvent attendue, mais l'itération est acceptée si elle est correcte.

Erreur n°3 : Oublier les cas particuliers (liste vide, insertion en fin)

Troisième erreur fréquente : ne pas gérer les cas limites. Par exemple, pour insérer un élément à une position donnée, il faut vérifier si la liste est vide, si on insère en tête, au milieu ou en fin. Beaucoup d'élèves écrivent du code qui marche pour le cas général mais plante sur une liste vide.

Prenons l'insertion en fin de liste :

def insertion_fin(tete, valeur):
    nouveau = Noeud(valeur)
    if tete is None:
        return nouveau
    courant = tete
    while courant.suivant is not None:
        courant = courant.suivant
    courant.suivant = nouveau
    return tete

Si on oublie le if tete is None, on aura une erreur d'attribut car on essaie d'accéder à courant.suivant sur None. De même, pour la suppression, il faut distinguer la suppression de la tête (où on change la tête) et celle d'un autre nœud.

Comment éviter cette erreur ?

Prends l'habitude de toujours te poser ces questions avant d'écrire une fonction sur une liste chaînée :

  • Que se passe-t-il si la liste est vide ?
  • Que se passe-t-il si l'élément est en tête ?
  • Que se passe-t-il si l'élément est en fin ?
  • Que se passe-t-il si l'élément n'existe pas ?

Teste systématiquement ton code avec ces cas. Par exemple, avec une liste vide, une liste à un seul élément, etc. C'est un excellent moyen d'éviter les bugs.

Cas d'usage concret : une file d'attente avec des listes chaînées

Les listes chaînées sont souvent utilisées pour implémenter des structures comme les piles (LIFO) et les files (FIFO). Imaginons une file d'attente pour un jeu vidéo : les joueurs arrivent et attendent leur tour. On peut utiliser une liste chaînée pour gérer cette file.

Voici un exemple d'implémentation d'une file avec une liste chaînée en Python :

class File:
    def __init__(self):
        self.tete = None
        self.queue = None

    def est_vide(self):
        return self.tete is None

    def enfiler(self, valeur):
        nouveau = Noeud(valeur)
        if self.est_vide():
            self.tete = nouveau
            self.queue = nouveau
        else:
            self.queue.suivant = nouveau
            self.queue = nouveau

    def defiler(self):
        if self.est_vide():
            return None
        valeur = self.tete.valeur
        self.tete = self.tete.suivant
        if self.tete is None:
            self.queue = None
        return valeur

Ici, on voit bien l'importance de gérer les cas particuliers : quand la file est vide, quand on enlève le dernier élément, etc. C'est un excellent exercice pour t'entraîner.

Conseils de méthode pour réussir en NSI et au bac

Pour éviter ces erreurs, voici quelques conseils pratiques :

  • Dessine la liste sur papier avec des flèches. Ça aide énormément à visualiser les références.
  • Utilise un débogueur ou des print pour suivre l'évolution des variables.
  • Écris des tests avec des cas limites. Par exemple, vérifie que ta fonction d'insertion fonctionne avec une liste vide.
  • Relis le cours sur les structures linéaires sur nsi-lycee.fr/cours pour consolider les bases.
  • Pratique sur des exercices variés, comme ceux de nsi-lycee.fr/exercices.

Pour le bac, les listes chaînées sont un grand classique. Tu peux tomber sur des questions de parcours, d'insertion, de suppression, ou d'implémentation d'une pile ou d'une file. En maîtrisant ces trois erreurs, tu seras bien armé·e.

Conclusion

Les listes chaînées sont une structure linéaire puissante, mais elles demandent de la rigueur. En évitant ces trois erreurs – perdre la tête, confondre récursivité et itération, et négliger les cas particuliers – tu gagneras en confiance et en précision. N'oublie pas : la pratique est la clé. Refais les exercices, teste ton code, et n'hésite pas à demander de l'aide quand tu bloques. Tu peux aussi consulter les fiches de révision pour un rappel rapide. Et si tu as besoin d'un coup de pouce supplémentaire, jette un œil à AlloBac ou AlloLycée pour des ressources complémentaires. Continue comme ça, tu vas y arriver !

📚 Pour aller plus loin

Questions fréquentes

Qu'est-ce qu'une liste chaînée en NSI ?

Une liste chaînée est une structure de données linéaire composée de nœuds. Chaque nœud contient une valeur et une référence (pointeur) vers le nœud suivant. Le dernier nœud pointe vers None. C'est une alternative aux tableaux, permettant des insertions et suppressions efficaces en début de liste.

Pourquoi ne faut-il pas perdre la tête d'une liste chaînée ?

La tête est le seul point d'entrée de la liste. Si on la perd, on ne peut plus accéder aux éléments. Il faut donc toujours conserver une variable qui pointe sur le premier nœud, et utiliser une autre variable pour parcourir la liste.

Quelle est la différence entre une liste chaînée et une liste Python classique ?

Une liste Python est un tableau dynamique où les éléments sont stockés en mémoire de façon contiguë, ce qui permet un accès direct par indice en O(1). Une liste chaînée stocke les éléments de façon non contiguë, chaque nœud pointant vers le suivant, ce qui rend l'accès par indice en O(n). En revanche, l'insertion en début de liste est O(1) pour une liste chaînée, alors qu'elle est O(n) pour une liste Python.

Comment réviser les listes chaînées pour le bac NSI ?

Pour réviser, il est conseillé de : 1) relire le cours sur les structures linéaires, 2) s'entraîner sur des exercices variés (parcours, insertion, suppression), 3) implémenter une pile et une file avec des listes chaînées, 4) tester son code avec des cas particuliers (liste vide, un seul élément). Des ressources sont disponibles sur nsi-lycee.fr.

Quels sont les cas particuliers à vérifier lors de l'insertion dans une liste chaînée ?

Il faut vérifier si la liste est vide (dans ce cas, le nouveau nœud devient la tête), si on insère en tête (il faut mettre à jour la tête), si on insère au milieu (il faut relier correctement les références), et si on insère en fin (il faut parcourir jusqu'au dernier nœud et mettre à jour son suivant).

Bravo ! Tu as lu cet article
Inscris-toi pour sauvegarder ta progression et gagner des XP
Creer mon compte
listes chaînées NSIstructure linéaireerreurs listes chaînéesNSIprogrammation Python
Pixel