English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
このチュートリアルでは、LinkedListクラスについて多くの例を通じて詳細に学びます。
JavaコレクションフレームワークのLinkedListクラスはリンクリストデータ構造の機能を提供します。
Java LinkedListクラスはダブルリンクリストの実装を提供します。
リンクリストの各要素はノード。これは、3フィールドがあります:
Prev - 前の要素のアドレスをリストに保存します。最初の要素はnullです。
Next - 次の要素のアドレスをリストに保存します。最後の要素はnullです。
Data - 実際のデータを保存します。
リンクリストの要素は順序で保存されていません。代わりに、分散しており、リンク(PrevおよびNext)で結ばれています。
ここでは、リンクリストに3要素です。
Dog - 一番目の要素はnullを前アドレスとして、Catのアドレスを次のアドレスとして持つ
Cat - 二番目の要素はDogのアドレスを前アドレスとして、Cowのアドレスを次のアドレスとして持つ
Cow - 最後の要素はCatのアドレスを前アドレスとして、nullを次の要素として持つ
これがJavaでリンクリストを作成する方法です:
LinkedList<Type> linkedList = new LinkedList<>();
ここでは、Typeはリンクリストのタイプを表します。例えば、
//整数のリンクリストを作成する LinkedList<Integer> linkedList = new LinkedList<>(); //文字列のリンクリストを作成する LinkedList<String> linkedList = new LinkedList<>();
例を示しましょう。
List<String> animals1 = new LinkedList<>();
ここでは、Listインターフェースを使用してリンクリストanimalsを宣言しました1、リンクリストはListインターフェースのメソッドしかアクセスできません。
もう一つの例を示しましょう。
Queue<String> animals2 = new LinkedList<>(); Deque<String> animals3 = new LinkedList<>();
ここでは、animal2Queueインターフェースのメソッドにアクセスできます。
しかし、animal3DequeやQueueインターフェースのメソッドしかアクセスできません。なぜなら、DequeはQueueのサブインターフェースだからです。
LinkedListは、リンクリスト内でさまざまな操作を実行できるさまざまなメソッドを提供します。
1.要素の追加:}add()メソッドを使用
リストの末尾に要素(ノード)を追加するには、add()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> animals = new LinkedList<>(); //LinkedListに要素を追加 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat, Horse]
2.要素の追加:インデックスを使用
要素(ノード)をリストの末尾に追加するには、add()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> animals = new LinkedList<>(); //インデックスを使用して要素を追加 animals.add(0,"Dog"); animals.add(1,"Cat"); animals.add(2,"Horse"); System.out.println("LinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat, Horse]
3.要素の追加:リストを別のリストに追加
リストのすべての要素を別のリストに追加するには、addAll()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args){ LinkedList<String> mammals = new LinkedList<>(); mammals.add("Dog"); mammals.add("Cat"); mammals.add("Horse"); System.out.println("Mammals: ") + mammals); LinkedList<String> animals = new LinkedList<>(); animals.add("Crocodile"); //mammalsのすべての要素をanimalsに追加 animals.addAll(mammals); System.out.println("Animals: ") + animals); } }
出力結果
Mammals: [Dog, Cat, Horse] Animals: [Crocodile, Dog, Cat, Horse]
4.要素の追加:listIterator()メソッドを使用
リストに要素を追加するには、listsIterator()メソッドを使用できます。これを使用するには、java.util.ListIteratorパッケージをインポートする必要があります。例えば、
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); //ListIteratorオブジェクトを生成します ListIterator<String> listIterate = animals.listIterator(); listIterate.add("Dog"); listIterate.add("Cat"); System.out.println("LinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat]
1.要素へのアクセス:get()メソッドを使用
リストの要素にアクセスするには、get()メソッドを使用できます。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //リストから要素を取得 String str = animals.get(1); System.out.print("インデックス1の要素: " + str); } }
出力結果
LinkedList: [Dog, Horse, Cat] インデックス1の要素: Horse
2.要素へのアクセス:iterator()メソッドを使用
リストの要素を巡回するには、iterator()メソッドを使用できます。このメソッドを使用するには、java.util.Iteratorパッケージをインポートする必要があります。例えば、
import java.util.LinkedList; import java.util.Iterator; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); //Iteratorのオブジェクトを作成します Iterator<String> iterate = animals.iterator(); System.out.print("LinkedList: "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
出力結果
LinkedList: Dog, Cat, Horse,
ここでは、
hasNext() - 次の要素が存在する場合、trueを返します
next() - 次の要素を返します
3.要素のアクセス:listIterator()メソッドを使用します
リンクリストの要素をイテレートするためにlistIterator()メソッドを使用することもできます。このメソッドを使用するには、java.util.ListIteratorパッケージをインポートする必要があります。
listsIterator()メソッドはリンクリストに適しています。これは、listIterator()オブジェクトが後方に進むこともできるためです。例えば、
import java.util.LinkedList; import java.util.ListIterator; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); //ListIteratorオブジェクトを生成します ListIterator<String> listIterate = animals.listIterator(); System.out.print("LinkedList: "); while(listIterate.hasNext()) { System.out.print(listIterate.next()); System.out.print(", "); } // 後方に進む System.out.print("\n逆順LinkedList: "); while(listIterate.hasPrevious()) { System.out.print(listIterate.previous()); System.out.print(", "); } } }
出力結果
LinkedList: Dog, Horse, Cat, 逆順LinkedList: Cat, Horse, Dog,
ここでは、
hasNext() - 次の要素が存在する場合、trueを返します
next() - 次の要素を返します
hasPrevious() - 前の要素が存在する場合、trueを返します
previous() - 前の要素を返します
1.要素の検索:contains()メソッドを使用します
特定の要素がリンクリストに含まれているかを確認するには、contains()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //Dogがリンクリストに存在するか確認します if(animals.contains("Dog")) { System.out.println("DogはLinkedListにあります。"); } } }
出力結果
LinkedList: [Dog, Horse, Cat] DogはLinkedListにあります。
2.検索要素:indexOf()メソッドを使用します
indexOf() - 要素が最初に出现したインデックスを返します
lastIndexOf() - 要素が最後に出现したインデックスを返します
例如,
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); // リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: "); + animals); //Dogが最初に出现しました int index1 = animals.indexOf("Dog"); System.out.println("Dogが最初に出现した索引値: " + index1); //最後にDogが出现しました int index2 = animals.lastIndexOf("Dog"); System.out.println("Dogの最後のインデックス値: ") + index2); } }
出力結果
LinkedList: [Dog, Horse, Cat, Dog] Dogの最初のインデックス値: 0 Dogの最後のインデックス値: 3
注意:指定された要素が見つからない場合、indexOf()とlastIndexOf()はすべてのものが-1.
1.要素の変更:set()メソッドの使用
リンクリストの要素を変更するには、set()メソッドを使用できます。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: "); + animals); //変更するインデックス値が3の要素 animals.set(3, "Zebra"); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse, Cat, Dog] 新しいLinkedList: [Dog, Horse, Cat, Zebra]
2.要素の変更:listIterator()メソッドの使用
リンクリストの要素を変更するためにlistIterator()メソッドを使用することもできます。例えば、
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); // リストに要素を追加 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: "); + animals); //ListIteratorオブジェクトを生成します ListIterator<String> listIterate = animals.listIterator(); listIterate.next(); //next()が返す要素を変更します listIterate.set("Cow"); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat, Horse] 新しいLinkedList: [Cow, Cat, Horse]
1.要素の削除:remove()メソッドの使用
リンクリストから要素を削除するには、remove()メソッドを使用できます。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); animals.add("Zebra"); System.out.println("LinkedList: "); + animals); //削除するインデックス値が1の要素 String str = animals.remove(1); System.out.println("削除する要素: ") + str); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse, Cat, Zebra] 削除する要素: Horse 新しいLinkedList: [Dog, Cat, Zebra]
2.要素の削除:listIterator()メソッドの使用
リンクリストから要素を削除するためにlistsIterator()メソッドを使用することもできます。例えば、
import java.util.ArrayList; import java.util.ListIterator; class Main { public static void main(String[] args) { ArrayList<String> animals = new ArrayList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: "); + animals); //ListIteratorオブジェクトを生成します ListIterator<String> listIterate = animals.listIterator(); listIterate.next(); //next()が返す要素を削除します listIterate.remove(); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat, Horse] 新しいLinkedList: [Cat, Horse]
3.要素の削除:clear()メソッドの使用
リンクリストからすべての要素を削除するには、clear()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<String> animals = new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedList: "); + animals); //すべての要素を削除します animals.clear(); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Cat, Horse] 新しいLinkedList: []
注意:removeAll()メソッドを使用してすべての要素を削除することもできますが、clear()メソッドはremoveAll()メソッドよりも効率的です。
4.要素の削除:removeIf()メソッドの使用
特定の条件を満たす要素がある場合、リンクリストからこれらを削除することもできます。これにはremoveIf()メソッドを使用します。例えば、
import java.util.LinkedList; class Main { public static void main(String[] args) { LinkedList<Integer> animals = new LinkedList<>(); //リストに要素を追加 animals.add(2); animals.add(3); animals.add(4); animals.add(5); System.out.println("LinkedList: "); + animals); // すべての小于4の要素 animals.removeIf((Integer i)->i < 4); System.out.println("新しいLinkedList: "); + animals); /** ここではlambda式を使用しています * 今、これを覚えておいてください * removeIf()の引数は条件です */ } }
出力結果
LinkedList: [2, 3, 4, 5] 新しいLinkedList: [4, 5]
注意: (Integer i)->i<4 これはlambda式です。lambda式について学びたい場合は、Java Lambda式
LinkedListクラスはQueueおよびDequeインターフェースも実装しているため、これらのインターフェースのメソッドを実装することもできます。以下は、一般的に使用されるメソッドの一部です:
addFirst() - 指定された要素をリンクリストの先頭に追加します
addLast() - 指定された要素をリンクリストの末尾に追加します
例如,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args){ Deque<String> animals = new LinkedList<>(); //要素をLinkedListの先頭に追加します animals.addFirst("Cow"); animals.addFirst("Dog"); animals.addFirst("Cat"); System.out.println("LinkedList: "); + animals); //LinkedListの末尾に要素を追加 animals.addLast("Zebra"); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Cat, Dog, Cow] 新的LinkedList: [Cat, Dog, Cow, Zebra]
getFirst() - 返回第一个元素
getLast() - 返回最后一个元素
例如,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args) { Deque<String> animals= new LinkedList<>(); // リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //从链表中获取第一个元素 String str1 = animals.getFirst(); System.out.println("第一个元素: " + str1); //从链表中获取最后一个元素 String str2 = animals.getLast(); System.out.println("最后一个元素: " + str2); } }
出力結果
LinkedList: [Dog, Horse, Cat] 第一个元素: Dog 最后一个元素: Cat
removeFirst() - 删除第一个元素
removeLast() - 删除最后一个元素
例如,
import java.util.LinkedList; import java.util.Deque; class Main { public static void main(String[] args) { Deque<String> animals= new LinkedList<>(); // リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //从LinkedList删除第一个元素 String str1 = animals.removeFirst(); System.out.println("删除的元素: " + str1); //从LinkedList删除最后一个元素 String str2 = animals.removeLast(); System.out.println("删除的元素: " + str2); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse, Cat] 删除的元素: Dog 删除的元素: Cat 新的LinkedList: [Horse]
peek()方法返回链表的第一个元素(头)。例如,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals= new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //访问LinkedList的第一个元素 String str = animals.peek(); System.out.println("元素访问: " + str); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse, Cat] 元素访问: Dog 新しいLinkedList: [Dog, Horse, Cat]
poll()方法返回并从链表中删除第一个元素。例如,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals= new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); animals.add("Cat"); System.out.println("LinkedList: "); + animals); //返回并删除第一个元素 String str = animals.poll(); System.out.println("删除的元素: " + str); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse, Cat] 删除的元素: Dog 新的LinkedList: [Horse, Cat]
该offer()方法将指定的元素添加到链接列表的末尾。例如,
import java.util.LinkedList; import java.util.Queue; class Main { public static void main(String[] args) { Queue<String> animals= new LinkedList<>(); //リストに要素を追加 animals.add("Dog"); animals.add("Horse"); System.out.println("LinkedList: "); + animals); //LinkedListの末尾に要素を追加 animals.offer("Cat"); System.out.println("新しいLinkedList: "); + animals); } }
出力結果
LinkedList: [Dog, Horse] 新しいLinkedList: [Dog, Horse, Cat]
1.使用forEach循环を遍历
import java.util.LinkedList; class Main { public static void main(String[] args) { //创建一个链表 LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: "); + animals); //使用forEach循环 System.out.println("访问链表元素:"); for(String animal: animals) { System.out.print(animal); System.out.print(", "); } } }
出力結果
LinkedList: [牛、猫、犬] 访问链表元素: 牛、猫、犬、
2.使用for循环
import java.util.LinkedList; class Main { public static void main(String[] args) { //创建一个链表 LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: "); + animals); //使用for循环 System.out.println("访问链表元素:"); for(int i=0; i < animals.size(); i++) { System.out.print(animals.get(i)); System.out.print(", "); } } }
出力結果
LinkedList: [牛、猫、犬] 访问链表元素: 牛、猫、犬、
在两个示例中,我们都使用循环访问链表的各个元素。
3.使用iterator()方法
我们可以使用iterator()方法访问链表的元素。为了使用这种方法,我们必须导入java.util.Iteratorパッケージ。
import java.util.LinkedList; import java.util.Iterator; class Main { public static void main(String[] args) { //创建一个链表 LinkedList<String> animals = new LinkedList<>(); animals.add("Cow"); animals.add("Cat"); animals.add("Dog"); System.out.println("LinkedList: "); + animals); //使用iterator()方法 System.out.println("LinkedList使用iterator()方法:"); Iterator<String> iterate = animals.iterator(); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
出力結果
LinkedList: [牛、猫、犬] LinkedListはiterator()メソッドを使用します: 牛、猫、犬、
LinkedListとArrayListはCollectionsフレームワークのListインターフェースを実装しています。しかし、彼らはいくつかの違いがあります。
LinkedList | ArrayList |
---|---|
単一の場所に保存します。3の値(前のアドレス、データ、次のアドレス) | 単一の場所に単一の値を保存します。 |
リストのダブルリンクリスト実装を提供します。 | 可変サイズの配列実装を提供します。 |
要素を追加するたびに、前のと次のアドレスが変更されます。 | 要素を追加するたびに、その位置以降のすべての要素が移動します。 |
要素にアクセスするには、要素までの迭代を開始する必要があります。 | 要素にランダムにアクセスするには、インデックスを使用できます。 |