Implémentation de LinkedList en Java
Il est temps de vous mettre au défi avec des tâches vraiment complexes.
Nous allons implémenter notre structure de données simplifiée—plus précisément, la SinglyLinkedList.
Commençons par implémenter la classe Node, qui stockera une valeur et une référence vers le Node suivant.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
L’implémentation de la classe Node dans SinglyLinkedList a déjà été présentée dans le chapitre précédent, nous n’y reviendrons donc pas en détail.
Ensuite, créons la classe SinglyLinkedList, dans laquelle nous définirons toute la logique de notre structure de données :
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Nous avons créé le champ Node head, qui stockera le premier élément de notre structure de données.
Dans une LinkedList classique, il existe également une head et une tail qui stockent respectivement le premier et le dernier élément de la structure de données. Puisque la structure de données doit être vide lors de l’initialisation, nous initialisons ce champ à null dans le constructeur.
Notre structure de données doit prendre en charge toutes les opérations CRUD.
Création
Procédure étape par étape pour écrire une méthode permettant d’ajouter un élément à la fin de la liste, représentant l’opération de création :
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Ci-dessus, présentation de l’implémentation de la méthode permettant d’ajouter un élément à la fin de la liste. Analyse du fonctionnement de cette méthode :
-
Création d’un objet de la classe
Node, nomménewNode, initialisé via le constructeur, en transmettant ladataissue des paramètres de la méthodeappend(); -
Vérification si la liste est vide ; si tel est le cas, remplacement du premier élément de la liste (
head) parnewNodevia réaffectation ; -
Ajout d’une instruction
returnpour quitter la méthode ; -
Si la liste n’est pas vide, création dans cette méthode d’un nouvel objet,
current, représentant leNode headdans ce contexte ; -
Utilisation d’une boucle
whilepour parcourir l’ensemble de la liste jusqu’à ce quecurrent.nextsoitnull, c’est-à-dire jusqu’à ce que l’élément suivant de la liste soit vide ; -
Une fois le dernier élément non nul de la liste trouvé, affectation de son lien à
newNode, ajoutant ainsi l’élément à la liste.
En d’autres termes, l’objectif de la méthode append est de définir le lien du dernier élément vers le nouvel élément. De cette manière, ajout d’un nouvel élément à la liste.
Lecture
Passons à la suite ; nous devons maintenant implémenter l’opération de lecture.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
L’opération de lecture est assez simple. Il faut itérer sur chaque élément de la liste et les afficher à l’écran. Dans notre cas, nous utilisons également le placeholder
current, que nous initialisons avec leNode head; -
Ensuite, nous définissons la condition de la boucle while à
current != nullet affichons le champdataà l’écran ; -
Pour parcourir la liste, nous utilisons la référence en réaffectant
current, ce qui donnecurrent = current.next;; -
Nous répétons cela jusqu’à ce que le
Node currentsoit vide. Après cela, nous sortons de la boucle et passons à la ligne suivante.
Au fait, réfléchissez à comment remplacer cette boucle while par une boucle do-while. Est-ce possible ?
Mise à jour
Passons maintenant à la méthode de mise à jour, dont l’implémentation est plus intéressante :
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Tout d'abord, vérification de la présence de cet
indexdans la liste à l'aide d'une instructionif. Si ce n'est pas le cas, affichage du message "Invalid index" et arrêt de la méthode. Cette étape est réalisée pour éviter les erreurs ; -
Si l’index est compris dans les limites de la liste, poursuite avec l’algorithme habituel. Création d’un objet de la classe
Nodenommécurrent, initialisé avec la valeur dehead; -
Au lieu d’utiliser une boucle
while, utilisation d’une bouclefor, plus appropriée ici puisque le nombre exact d’itérations est connu. Le nombre d’itérations correspond à la valeur du paramètreindex; -
La boucle s’écrit ainsi :
for (int i = 0; i < index; i++). Dans cette boucle, recherche de l’élément souhaité à l’aide de l’opération connue :current = current.next; -
Une fois l’élément trouvé, affectation d’une nouvelle valeur à son attribut
datavia l’opérationcurrent.data = newData. La valeurnewDataest fournie en paramètre de cette méthode.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Génial!
Completion taux amélioré à 4
Implémentation de LinkedList en Java
Glissez pour afficher le menu
Il est temps de vous mettre au défi avec des tâches vraiment complexes.
Nous allons implémenter notre structure de données simplifiée—plus précisément, la SinglyLinkedList.
Commençons par implémenter la classe Node, qui stockera une valeur et une référence vers le Node suivant.
Node.java
123456789class Node { int data; Node next; public Node(int data) { this.data = data; this.next = null; } }
L’implémentation de la classe Node dans SinglyLinkedList a déjà été présentée dans le chapitre précédent, nous n’y reviendrons donc pas en détail.
Ensuite, créons la classe SinglyLinkedList, dans laquelle nous définirons toute la logique de notre structure de données :
SinglyLinkedList.java
1234567public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } }
Nous avons créé le champ Node head, qui stockera le premier élément de notre structure de données.
Dans une LinkedList classique, il existe également une head et une tail qui stockent respectivement le premier et le dernier élément de la structure de données. Puisque la structure de données doit être vide lors de l’initialisation, nous initialisons ce champ à null dans le constructeur.
Notre structure de données doit prendre en charge toutes les opérations CRUD.
Création
Procédure étape par étape pour écrire une méthode permettant d’ajouter un élément à la fin de la liste, représentant l’opération de création :
SinglyLinkedList.java
12345678910111213141516171819202122public class SinglyLinkedList { private Node head; public SinglyLinkedList() { this.head = null; } public void append(int data) { Node newNode = new Node(data); if (head == null) { head = newNode; return; } Node current = head; while (current.next != null) { current = current.next; } current.next = newNode; } }
Ci-dessus, présentation de l’implémentation de la méthode permettant d’ajouter un élément à la fin de la liste. Analyse du fonctionnement de cette méthode :
-
Création d’un objet de la classe
Node, nomménewNode, initialisé via le constructeur, en transmettant ladataissue des paramètres de la méthodeappend(); -
Vérification si la liste est vide ; si tel est le cas, remplacement du premier élément de la liste (
head) parnewNodevia réaffectation ; -
Ajout d’une instruction
returnpour quitter la méthode ; -
Si la liste n’est pas vide, création dans cette méthode d’un nouvel objet,
current, représentant leNode headdans ce contexte ; -
Utilisation d’une boucle
whilepour parcourir l’ensemble de la liste jusqu’à ce quecurrent.nextsoitnull, c’est-à-dire jusqu’à ce que l’élément suivant de la liste soit vide ; -
Une fois le dernier élément non nul de la liste trouvé, affectation de son lien à
newNode, ajoutant ainsi l’élément à la liste.
En d’autres termes, l’objectif de la méthode append est de définir le lien du dernier élément vers le nouvel élément. De cette manière, ajout d’un nouvel élément à la liste.
Lecture
Passons à la suite ; nous devons maintenant implémenter l’opération de lecture.
SinglyLinkedList.java
12345678public void display() { Node current = head; while (current != null) { System.out.print(current.data + " "); current = current.next; } System.out.println(); }
-
L’opération de lecture est assez simple. Il faut itérer sur chaque élément de la liste et les afficher à l’écran. Dans notre cas, nous utilisons également le placeholder
current, que nous initialisons avec leNode head; -
Ensuite, nous définissons la condition de la boucle while à
current != nullet affichons le champdataà l’écran ; -
Pour parcourir la liste, nous utilisons la référence en réaffectant
current, ce qui donnecurrent = current.next;; -
Nous répétons cela jusqu’à ce que le
Node currentsoit vide. Après cela, nous sortons de la boucle et passons à la ligne suivante.
Au fait, réfléchissez à comment remplacer cette boucle while par une boucle do-while. Est-ce possible ?
Mise à jour
Passons maintenant à la méthode de mise à jour, dont l’implémentation est plus intéressante :
SinglyLinkedList.java
12345678910111213public void update(int index, int newData) { if (index < 0 || index >= size()) { System.out.println("Invalid index"); return; } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } current.data = newData; }
-
Tout d'abord, vérification de la présence de cet
indexdans la liste à l'aide d'une instructionif. Si ce n'est pas le cas, affichage du message "Invalid index" et arrêt de la méthode. Cette étape est réalisée pour éviter les erreurs ; -
Si l’index est compris dans les limites de la liste, poursuite avec l’algorithme habituel. Création d’un objet de la classe
Nodenommécurrent, initialisé avec la valeur dehead; -
Au lieu d’utiliser une boucle
while, utilisation d’une bouclefor, plus appropriée ici puisque le nombre exact d’itérations est connu. Le nombre d’itérations correspond à la valeur du paramètreindex; -
La boucle s’écrit ainsi :
for (int i = 0; i < index; i++). Dans cette boucle, recherche de l’élément souhaité à l’aide de l’opération connue :current = current.next; -
Une fois l’élément trouvé, affectation d’une nouvelle valeur à son attribut
datavia l’opérationcurrent.data = newData. La valeurnewDataest fournie en paramètre de cette méthode.
Merci pour vos commentaires !