Java LinkedList listIterator() メソッド

Java LinkedList Java LinkedList


listIterator()メソッドは Java におけるLinkedListクラスが提供する重要なメソッドで、返すのはListIteratorオブジェクトで、リンクリスト内の要素を走査するために使用します。通常のIteratorと比較すると、ListIteratorより豊富な操作機能を提供します。

メソッド構文

public ListIterator<E> listIterator()
public ListIterator<E> listIterator(int index)
  • 引数なしバージョン:リンクリストの先頭から始まるリストイテレータを返します
  • 引数ありバージョン:指定したインデックス位置から始まるリストイテレータを返します

メソッドパラメータ

index パラメータ

  • 型:int
  • 意味:イテレータの開始位置のインデックス
  • 値の範囲:0 <= index <= size()
  • 渡されたインデックスがリンクリストのサイズ(size()) と等しい場合、イテレータはリンクリストの末尾を指します

戻り値

返すのはListIteratorオブジェクトで、リンクリストを双方向に走査する機能を提供します。


ListIterator の主要メソッド

走査メソッド

  • boolean hasNext():次の要素が存在するかどうかを確認します
  • E next():次の要素を返し、カーソルを後方へ移動します
  • boolean hasPrevious():前の要素が存在するかどうかを確認します
  • E previous():前の要素を返し、カーソルを前方へ移動します

変更メソッド

  • void add(E e):現在位置に要素を挿入します
  • void remove():最後の呼び出しでnext() 或 previous()返された要素を削除します
  • void set(E e):最後の呼び出しでnext() 或 previous()返された要素を置換します

使用例

基本走査例

例

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

public class Main {
    public static void main(String[] args) {
        LinkedList<String> fruits = new LinkedList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
       
        // ListIterator を取得
        ListIterator<String> iterator = fruits.listIterator();
       
        // 順方向に走査
        System.out.println("順方向の走査:");
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
       
        // 逆方向に走査
        System.out.println("\n逆方向の走査:");
        while(iterator.hasPrevious()) {
            System.out.println(iterator.previous());
        }
    }
}

指定位置から走査する

例

ListIterator<String> iterator = fruits.listIterator(1);  // インデックス1から開始
System.out.println("インデックス1から走査:");
while(iterator.hasNext()) {
    System.out.println(iterator.next());
}

リンクリストの内容を変更する

例

ListIterator<String> iterator = fruits.listIterator();
iterator.next();  // 最初の要素に移動
iterator.set("Apricot");  // 最初の要素を変更
iterator.add("Blueberry");  // 現在位置に新しい要素を追加

System.out.println("変更後のリンクリスト:");
for(String fruit : fruits) {
    System.out.println(fruit);
}

注意事項

  1. 並行変更:反復処理中にイテレータ自身のメソッド以外の方法でリンクリストを変更した場合は、ConcurrentModificationException例外がスローされます。

  2. 初期位置:新しく作成されたListIteratorのカーソルの初期位置は、最初の要素の前(引数なしバージョンの場合)または指定したインデックス位置の前(引数ありバージョンの場合)です。

  3. 境界チェック:呼び出し時に、next() 或 previous()対応する要素がない場合は、例外がスローされますNoSuchElementException。

  4. 変更操作の制限:を呼び出すadd()、remove() 或 set()前に、必ず を呼び出す必要がありますnext() 或 previous()。そうしないと例外がスローされますIllegalStateException。


Iterator との違い

特性 Iterator ListIterator
走査方向 単方向(前方のみ) 双方向(前方と後方)
変更メソッド remove() のみ add(), remove(), set()
インデックスの取得 非対応 nextIndex() と previousIndex() に対応
作成方法 iterator() listIterator()

パフォーマンスに関する考慮事項

  • LinkedListのlistIterator()メソッドの時間計算量は O(1) です。新しいイテレータオブジェクトを作成するだけだからです。
  • イテレータ自体の各種操作(例:next()、previous())の時間計算量は O(1) です。なぜならLinkedListは双方向リンクリストに基づいて実装されているからです。
  • リストの途中で頻繁に挿入や削除を行う必要があるシナリオでは、ListIteratorを使用すると、インデックスによる直接操作よりも効率的です。

まとめ

LinkedListのlistIterator()メソッドは通常のイテレータよりも強力な機能を提供し、走査中にリンクリストの内容を変更する必要がある場合や双方向の走査が必要な場合に特に適しています。このメソッドを理解して使いこなせば、より効率的に を操作できます。LinkedList。

Java LinkedList Java LinkedList

その他の拡張