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
current
et previous
.next
du 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:
prev
de la nouvelle tête si elle existe.prev
du nœud suivant et le pointeur next
du nœud précédent pour contourner le nœud à supprimer.
Cas particuliers
Il faut considérer les cas particuliers suivants :
head
de la liste.
Ce qu'il faut retenir
next
du nœud précédent.next
et prev
des nœuds adjacents.
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_node
ne 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.