Numérique et Sciences Informatiques > Algorithmique : Structures de Données Avancées > Listes Chaînées > Implémentation (simplement et doublement chaînées)
Suppression de noeuds dans les listes chainées
Suppression de noeuds dans les listes chainées. Explication du fonctionnement, les opérations fondamentales et des exemples pratiques adaptés aux élèves de lycée.
Introduction à la suppression de nœuds
La suppression de nœuds est une opération fondamentale dans les listes chaînées. Elle consiste à retirer un nœud de la liste tout en maintenant l'intégrité de la structure. La méthode de suppression diffère légèrement entre les listes simplement chaînées et doublement chaînées en raison de la présence ou de l'absence de pointeurs vers le nœud précédent.
Suppression dans une liste simplement chaînée
Dans une liste simplement chaînée, la suppression d'un nœud nécessite de modifier le pointeur next du nœud précédent celui qu'on souhaite supprimer pour qu'il pointe vers le nœud suivant celui qu'on supprime. Voici un exemple en Python :
class LinkedList:
def __init__(self):
self.head = None
#... les autres methodes comme insert_at_beginning et display sont omises pour la clarté
def delete_node(self, key):
current = self.head
previous = None
# Si le noeud à supprimer est la tete
if current is not None and current.data == key:
self.head = current.next
current = None
return
# Recherche de la clé à supprimer
while current is not None and current.data != key:
previous = current
current = current.next
# Si la clé n'est pas trouvée
if current is None:
return
# Suppression du noeud
previous.next = current.next
current = None
# Exemple d'utilisation:
linked_list = LinkedList()
linked_list.insert_at_beginning(3)
linked_list.insert_at_beginning(7)
linked_list.insert_at_beginning(10)
linked_list.delete_node(7)
linked_list.display() #Output : 10 -> 3 -> None
Explication
- On parcourt la liste avec
currentetprevious. - Si le nœud à supprimer est la tête, on met à jour la tête de la liste.
- Sinon, on cherche le nœud à supprimer et on met à jour le pointeur
nextdu nœud précédent.
Suppression dans une liste doublement chaînée
La suppression dans une liste doublement chaînée est plus simple car on a accès au nœud précédent. Il faut mettre à jour les pointeurs next et prev des nœuds adjacents. Voici un exemple en Python :
class DoublyLinkedList:
def __init__(self):
self.head = None
#... les autres methodes comme insert_at_beginning et display sont omises pour la clarté
def delete_node(self, key):
current = self.head
# Si le noeud à supprimer est la tete
if current is not None and current.data == key:
self.head = current.next
if self.head is not None:
self.head.prev = None
return
# Recherche de la clé à supprimer
while current is not None and current.data != key:
current = current.next
# Si la clé n'est pas trouvée
if current is None:
return
# Suppression du noeud
if current.next is not None:
current.next.prev = current.prev
if current.prev is not None:
current.prev.next = current.next
# Exemple d'utilisation:
doubly_linked_list = DoublyLinkedList()
doubly_linked_list.insert_at_beginning(3)
doubly_linked_list.insert_at_beginning(7)
doubly_linked_list.insert_at_beginning(10)
doubly_linked_list.delete_node(7)
doubly_linked_list.display() #Output: 10 <-> 3 <-> None
Explication:
- Si le noeud à supprimer est la tête, on met à jour la tête et le pointeur
prevde la nouvelle tête si elle existe. - Sinon, on met à jour le pointeur
prevdu nœud suivant et le pointeurnextdu nœud précédent pour contourner le nœud à supprimer.
Cas particuliers
Il faut considérer les cas particuliers suivants :
- Liste vide : La suppression ne peut pas être effectuée si la liste est vide.
- Nœud à supprimer non trouvé : Il faut gérer le cas où le nœud à supprimer n'est pas présent dans la liste.
- Suppression du premier nœud (tête) : Il faut mettre à jour le pointeur
headde la liste.
Ce qu'il faut retenir
- La suppression de nœuds est une opération essentielle dans les listes chaînées.
- La suppression dans une liste simplement chaînée nécessite de modifier le pointeur
nextdu nœud précédent. - La suppression dans une liste doublement chaînée nécessite de modifier les pointeurs
nextetprevdes nœuds adjacents. - Il faut gérer les cas particuliers comme la liste vide, le nœud non trouvé et la suppression de la tête.
FAQ
-
Que se passe-t-il si j'essaie de supprimer un nœud qui n'existe pas dans la liste ?
Dans les exemples donnés, la fonctiondelete_nodene fait rien si le nœud à supprimer n'est pas trouvé. Vous pouvez ajouter une exception ou un message d'erreur pour signaler cette situation. -
La suppression d'un nœud libère-t-elle automatiquement la mémoire qu'il occupait ?
En Python, le garbage collector gère automatiquement la libération de la mémoire. Une fois que le nœud n'est plus référencé par la liste, il sera éventuellement collecté par le garbage collector.