Méthode listIterator() de LinkedList en Java

Java LinkedList Java LinkedList


listIterator()La méthode est une méthode importante en JavaLinkedListfournie par la classe, elle renvoie unListIteratorobjet, utilisé pour parcourir les éléments de la liste chaînée. Comparé à l'ordinaireIteratorcomparé à,ListIteratoril fournit des fonctions d'opération plus riches.

Syntaxe de la méthode

public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
  • Version sans argument : renvoie un itérateur de liste commençant au début de la liste chaînée
  • Version paramétrée : renvoie un itérateur de liste commençant à la position d'index spécifiée

Paramètres de méthode

paramètre index

  • Type :int
  • Signification : l'index de position où l'itérateur commence
  • Plage de valeurs :0 <= index <= size()
  • Si l'indice passé est égal à la taille de la liste chaînée (size()), l'itérateur pointera vers la fin de la liste chaînée

Valeur de retour

Renvoie unListIteratorobjet, qui offre la possibilité de parcourir la liste chaînée de manière bidirectionnelle.


Méthodes principales de ListIterator

Méthodes de parcours

  • boolean hasNext(): Vérifie s'il existe un élément suivant
  • E next(): Renvoie l'élément suivant et déplace le curseur vers l'avant
  • boolean hasPrevious(): Vérifie s'il existe un élément précédent
  • E previous(): Renvoie l'élément précédent et déplace le curseur vers l'arrière

Méthodes de modification

  • void add(E e): Insère un élément à la position actuelle
  • void remove(): Supprime le dernier élément renvoyé en appelantnext()ouprevious()l'élément renvoyé par
  • void set(E e): Remplace le dernier élément renvoyé en appelantnext()ouprevious()l'élément renvoyé par

Exemples d'utilisation

Exemple de parcours de base

Exemple

import java.util.LinkedList;
import java.util.ListIterator;

public class Main {
    public static void main(String[] args) {
        LinkedList<String> fruits = new LinkedList<>();
        fruits.add("Pomme");
        fruits.add("Banane");
        fruits.add("Cherry");
       
        // Obtenir ListIterator
        ListIterator<String> iterator = fruits.listIterator();
       
        // Parcours en avant
        System.out.println("Parcours en avant :");
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
       
        // Parcours inverse
        System.out.println("\n"Parcours inverse :");
        while(iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

Parcours à partir d'une position spécifiée

Exemple

ListIterator<String> iterator = fruits.listIterator(1);  // Commencer à partir de l'index 1
System.out.println("Parcours à partir de l'index 1 :");
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

Modification du contenu de la liste chaînée

Exemple

ListIterator<String> iterator = fruits.listIterator();
iterator.next();  // Passer au premier élément
iterator.set("Abricot");  // Modifier le premier élément
iterator.add("Myrtille");  // Ajouter un nouvel élément à la position actuelle

System.out.println("Liste chaînée modifiée :");
for(String fruit : fruits) {
    System.out.println(fruit);
}

Notes

  1. Modification concurrente: Si la liste chaînée est modifiée par d'autres moyens pendant l'itération (plutôt que par les méthodes propres de l'itérateur), uneConcurrentModificationExceptionexception sera levée.

  2. Position initiale: Un objet nouvellement crééListIteratora son curseur initialement positionné avant le premier élément (pour la version sans argument) ou avant la position d'index spécifiée (pour la version paramétrée).

  3. Vérification des limites: Appelnext()ouprevious()lorsqu'il n'y a pas d'élément correspondant, uneNoSuchElementException。

  4. Restrictions des opérations de modification: Avant d'appeleradd()、remove()ouset()vous devez d'abord appelernext()ouprevious(), sinon uneIllegalStateException。


Différences avec Iterator

Fonctionnalité Iterator ListIterator
Sens de parcours Unidirectionnel (en avant uniquement) Bidirectionnel (avant et arrière)
Méthodes de modification Seulement remove() add(), remove(), set()
Obtenir l'index Non pris en charge Prend en charge nextIndex() et previousIndex()
Méthode de création iterator() listIterator()

Considérations de performance

  • LinkedListdelistIterator()La méthode a une complexité temporelle de O(1), car elle crée simplement un nouvel objet itérateur.
  • Les différentes opérations de l'itérateur lui-même (telles quenext()、previous()) ont une complexité temporelle de O(1), carLinkedListil est implémenté sur la base d'une liste doublement chaînée.
  • Pour les scénarios qui nécessitent des insertions ou suppressions fréquentes au milieu de la liste, l'utilisation deListIteratorest plus efficace que de passer directement par des indices.

Résumé

LinkedListdelistIterator()La méthode fournit des fonctionnalités plus puissantes qu'un itérateur classique, particulièrement adaptée aux scénarios où vous devez modifier le contenu de la liste chaînée pendant le parcours ou effectuer un parcours bidirectionnel. Comprendre et utiliser habilement cette méthode vous permet d'opérer plus efficacement surLinkedList。

Java LinkedList Java LinkedList

Autres extensions