Imaginez une chasse au trésor où chaque indice vous mène au suivant. Les Listes Chaînées fonctionnent de la même manière ! Chaque élément connaît l'emplacement du suivant, formant ainsi une chaîne d'éléments reliés.
Chaque nœud dans une liste chaînée est comme une petite boîte contenant :
Pourquoi utiliser des listes chaînées ? Voici quelques super-pouvoirs :
Les listes chaînées brillent dans des situations comme :
Voici comment créer une liste chaînée simple en Python :
class Node:
def __init__(self, valeur):
self.valeur = valeur
self.suivant = None
class SinglyLinkedList:
def __init__(self):
self.tete = None
def append(self, valeur):
nouveau_noeud = Node(valeur)
if not self.tete:
self.tete = nouveau_noeud
return
dernier = self.tete
while dernier.suivant:
dernier = dernier.suivant
dernier.suivant = nouveau_noeud
def afficher(self):
noeud_actuel = self.tete
while noeud_actuel:
print(noeud_actuel.valeur, end=" -> ")
noeud_actuel = noeud_actuel.suivant
print("None")
# Utilisation de la liste chaînée simple
ma_liste = SinglyLinkedList()
ma_liste.append(10)
ma_liste.append(20)
ma_liste.append(30)
ma_liste.afficher() # Sortie : 10 -> 20 -> 30 -> None
Pour naviguer dans les deux sens, utilisez une liste doublement chaînée :
class DoubleNode:
def __init__(self, valeur):
self.valeur = valeur
self.suivant = None
self.precedent = None
class DoublyLinkedList:
def __init__(self):
self.tete = None
def append(self, valeur):
nouveau_noeud = DoubleNode(valeur)
if not self.tete:
self.tete = nouveau_noeud
return
dernier = self.tete
while dernier.suivant:
dernier = dernier.suivant
dernier.suivant = nouveau_noeud
nouveau_noeud.precedent = dernier
def afficher(self):
noeud_actuel = self.tete
while noeud_actuel:
print(noeud_actuel.valeur, end=" <-> ")
noeud_actuel = noeud_actuel.suivant
print("None")
# Utilisation de la liste doublement chaînée
ma_liste_double = DoublyLinkedList()
ma_liste_double.append(10)
ma_liste_double.append(20)
ma_liste_double.append(30)
ma_liste_double.afficher() # Sortie : 10 <-> 20 <-> 30 <-> None
Pour créer une boucle sans fin, voici la liste circulaire :
class CircularNode:
def __init__(self, valeur):
self.valeur = valeur
self.suivant = None
class CircularLinkedList:
def __init__(self):
self.tete = None
def append(self, valeur):
nouveau_noeud = CircularNode(valeur)
if not self.tete:
self.tete = nouveau_noeud
nouveau_noeud.suivant = self.tete
return
dernier = self.tete
while dernier.suivant != self.tete:
dernier = dernier.suivant
dernier.suivant = nouveau_noeud
nouveau_noeud.suivant = self.tete
def afficher(self):
noeud_actuel = self.tete
if not self.tete:
return
while True:
print(noeud_actuel.valeur, end=" -> ")
noeud_actuel = noeud_actuel.suivant
if noeud_actuel == self.tete:
break
print("(retour au début)")
# Utilisation de la liste circulaire
ma_liste_circulaire = CircularLinkedList()
ma_liste_circulaire.append(10)
ma_liste_circulaire.append(20)
ma_liste_circulaire.append(30)
ma_liste_circulaire.afficher() # Sortie : 10 -> 20 -> 30 -> (retour au début)
Mettez en pratique ce que vous avez appris avec ces exercices :
# Exercices :
# 1. Implémentez une fonction pour insérer un nœud au début d'une liste chaînée simple.
# 2. Écrivez une méthode pour supprimer un nœud avec une valeur donnée dans une liste chaînée simple.
# 3. Créez une fonction qui inverse une liste chaînée simple.
# 4. Implémentez une liste doublement chaînée qui permet d'insérer et de supprimer des nœuds à n'importe quelle position.
# 5. Écrivez un programme qui détecte s'il y a une boucle dans une liste chaînée (liste circulaire).
# 6. Créez une liste chaînée circulaire qui modélise une playlist musicale en boucle, avec la possibilité de passer à la chanson suivante ou précédente.
Les Listes Chaînées sont comme des trains où chaque wagon est relié au suivant. Elles offrent une grande flexibilité pour gérer des données dynamiques. Choisissez le type de liste chaînée qui convient le mieux à votre situation :
Maintenant, vous êtes prêt à intégrer les Linked Lists dans vos projets et à profiter de leur puissance pour gérer des données dynamiques !