在本教程中,我們將通過許多示例詳細(xì)了解LinkedList類。
Java集合框架的LinkedList類提供了鏈表數(shù)據(jù)結(jié)構(gòu)的功能。

Java LinkedList類提供了雙向鏈表實(shí)現(xiàn)。

鏈表中的每個(gè)元素都稱為節(jié)點(diǎn)。它包含3個(gè)字段:
Prev - 將前一個(gè)元素的地址存儲(chǔ)在列表中。 第一個(gè)元素為null。
Next - 在列表中存儲(chǔ)下一個(gè)元素的地址。 最后一個(gè)元素為null。
Data - 存儲(chǔ)實(shí)際數(shù)據(jù)。
鏈表中的元素不是按順序存儲(chǔ)的。相反,它們是分散的,并通過鏈接(Prev和Next)連接。

在這里,鏈接列表中包含3個(gè)元素。
Dog - 第一個(gè)元素將null作為前一個(gè)地址,并將Cat的地址作為下一個(gè)地址
Cat - 第二個(gè)元素將Dog的地址作為前一個(gè)地址,將Cow的地址作為下一個(gè)地址
Cow - 最后一個(gè)元素將Cat的地址作為前一個(gè)地址,并將null作為下一個(gè)元素
這是我們?nèi)绾斡肑ava創(chuàng)建鏈接列表的方法:
LinkedList<Type> linkedList = new LinkedList<>();
此處,Type表示鏈接列表的類型。例如,
//創(chuàng)建整數(shù)類型的鏈表 LinkedList<Integer> linkedList = new LinkedList<>(); //創(chuàng)建字符串類型的鏈表 LinkedList<String> linkedList = new LinkedList<>();
讓我們舉個(gè)實(shí)例。
List<String> animals1 = new LinkedList<>();
在這里,我們使用List接口聲明了一個(gè)鏈表animals1,鏈表只能訪問List接口的方法。
讓我們?cè)倥e一個(gè)實(shí)例。
Queue<String> animals2 = new LinkedList<>(); Deque<String> animals3 = new LinkedList<>();
在這里,animal2可以訪問Queue接口的方法。
但是,animal3只能訪問Deque和Queue接口的方法。 這是因?yàn)镈eque是Queue的子接口。
LinkedList 提供了各種方法,使我們可以在鏈表中執(zhí)行不同的操作。
1.添加元素:使用add()方法
要將元素(節(jié)點(diǎn))添加到鏈表的末尾,我們使用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);
}
}輸出結(jié)果
LinkedList: [Dog, Cat, Horse]
2.添加元素:使用索引號(hào)
我們還可以使用索引將元素添加到鏈表中。例如,
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);
}
}輸出結(jié)果
LinkedList: [Dog, Cat, Horse]
3.添加元素:將一個(gè)鏈表添加到另一個(gè)鏈表
要將鏈表的所有元素添加到另一個(gè)鏈表,我們使用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);
}
}輸出結(jié)果
Mammals: [Dog, Cat, Horse] Animals: [Crocodile, Dog, Cat, Horse]
4.添加元素:使用listIterator()方法
我們還可以使用listsIterator()方法將元素添加到鏈表中。要使用它,我們必須導(dǎo)入java.util.ListIterator包。例如,
import java.util.ArrayList;
import java.util.ListIterator;
class Main {
public static void main(String[] args) {
ArrayList<String> animals= new ArrayList<>();
//創(chuàng)建ListIterator對(duì)象
ListIterator<String> listIterate = animals.listIterator();
listIterate.add("Dog");
listIterate.add("Cat");
System.out.println("LinkedList: " + animals);
}
}輸出結(jié)果
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);
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat] 索引1處的元素: Horse
2.訪問元素:使用iterator()方法
要遍歷鏈表的元素,我們可以使用iterator()方法。我們必須導(dǎo)入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");
//創(chuàng)建Iterator的對(duì)象
Iterator<String> iterate = animals.iterator();
System.out.print("LinkedList: ");
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}輸出結(jié)果
LinkedList: Dog, Cat, Horse,
這里,
hasNext() - 如果存在下一個(gè)元素,則返回true
next() - 返回下一個(gè)元素
3.訪問元素:使用listIterator()方法
我們還可以使用listIterator()方法來迭代鏈接列表的元素。要使用此方法,我們必須導(dǎo)入java.util.ListIterator包。
listsIterator()方法更適合用于鏈表。這是因?yàn)閘istIterator()的對(duì)象也可以向后迭代。例如
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");
//創(chuàng)建ListIterator對(duì)象
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(", ");
}
}
}輸出結(jié)果
LinkedList: Dog, Horse, Cat, 反向LinkedList: Cat, Horse, Dog,
這里,
hasNext() - 如果存在下一個(gè)元素,則返回true
next() - 返回下一個(gè)元素
hasPrevious() - 如果存在先前的元素,則返回true
previous() - 返回上一個(gè)元素
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中。");
}
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat] Dog在LinkedList中。
2.搜索元素:使用indexOf()方法
indexOf() - 返回元素第一次出現(xiàn)的索引
lastIndexOf() - 返回元素最后一次出現(xiàn)的索引
例如,
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);
//第一次出現(xiàn)Dog
int index1 = animals.indexOf("Dog");
System.out.println("第一次出現(xiàn)Dog的索引值: " + index1);
//最后一次出現(xiàn)Dog
int index2 = animals.lastIndexOf("Dog");
System.out.println("最后一次出現(xiàn)Dog的索引值: " + index2);
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat, Dog] 第一次出現(xiàn)Dog的索引值: 0 最后一次出現(xiàn)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);
}
}輸出結(jié)果
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);
//創(chuàng)建ListIterator對(duì)象
ListIterator<String> listIterate = animals.listIterator();
listIterate.next();
//更改由next()返回的元素
listIterate.set("Cow");
System.out.println("新的LinkedList: " + animals);
}
}輸出結(jié)果
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);
}
}輸出結(jié)果
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);
//創(chuàng)建ListIterator對(duì)象
ListIterator<String> listIterate = animals.listIterator();
listIterate.next();
//刪除next()返回的元素
listIterate.remove();
System.out.println("新的LinkedList: " + animals);
}
}輸出結(jié)果
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);
}
}輸出結(jié)果
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表達(dá)式
* 現(xiàn)在請(qǐng)記住
* removeIf()中的參數(shù)是一個(gè)條件
*/
}
}輸出結(jié)果
LinkedList: [2, 3, 4, 5] 新的LinkedList: [4, 5]
注意: (Integer i)->i<4 是lambda表達(dá)式。要了解lambda表達(dá)式,請(qǐng)?jiān)L問Java Lambda表達(dá)式
由于LinkedList類還實(shí)現(xiàn)了Queue和Deque接口,因此它也可以實(shí)現(xiàn)這些接口的方法。 以下是一些常用方法:
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);
}
}輸出結(jié)果
LinkedList: [Cat, Dog, Cow] 新的LinkedList: [Cat, Dog, Cow, Zebra]
getFirst() - 返回第一個(gè)元素
getLast() - 返回最后一個(gè)元素
例如,
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);
//從鏈表中獲取第一個(gè)元素
String str1 = animals.getFirst();
System.out.println("第一個(gè)元素: " + str1);
//從鏈表中獲取最后一個(gè)元素
String str2 = animals.getLast();
System.out.println("最后一個(gè)元素: " + str2);
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat] 第一個(gè)元素: Dog 最后一個(gè)元素: Cat
removeFirst() - 刪除第一個(gè)元素
removeLast() - 刪除最后一個(gè)元素
例如,
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刪除第一個(gè)元素
String str1 = animals.removeFirst();
System.out.println("刪除的元素: " + str1);
//從LinkedList刪除最后一個(gè)元素
String str2 = animals.removeLast();
System.out.println("刪除的元素: " + str2);
System.out.println("新的LinkedList: " + animals);
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat] 刪除的元素: Dog 刪除的元素: Cat 新的LinkedList: [Horse]
peek()方法返回鏈表的第一個(gè)元素(頭)。例如,
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的第一個(gè)元素
String str = animals.peek();
System.out.println("元素訪問: " + str);
System.out.println("新的LinkedList: " + animals);
}
}輸出結(jié)果
LinkedList: [Dog, Horse, Cat] 元素訪問: Dog 新的LinkedList: [Dog, Horse, Cat]
poll()方法返回并從鏈表中刪除第一個(gè)元素。例如,
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);
//返回并刪除第一個(gè)元素
String str = animals.poll();
System.out.println("刪除的元素: " + str);
System.out.println("新的LinkedList: " + animals);
}
}輸出結(jié)果
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);
}
}輸出結(jié)果
LinkedList: [Dog, Horse] 新的LinkedList: [Dog, Horse, Cat]
1.使用forEach循環(huán)遍歷
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
//創(chuàng)建一個(gè)鏈表
LinkedList<String> animals = new LinkedList<>();
animals.add("Cow");
animals.add("Cat");
animals.add("Dog");
System.out.println("LinkedList: " + animals);
//使用forEach循環(huán)
System.out.println("訪問鏈表元素:");
for(String animal: animals) {
System.out.print(animal);
System.out.print(", ");
}
}
}輸出結(jié)果
LinkedList: [Cow, Cat, Dog] 訪問鏈表元素: Cow, Cat, Dog,
2.使用for循環(huán)
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
//創(chuàng)建一個(gè)鏈表
LinkedList<String> animals = new LinkedList<>();
animals.add("Cow");
animals.add("Cat");
animals.add("Dog");
System.out.println("LinkedList: " + animals);
//使用for循環(huán)
System.out.println("訪問鏈表元素:");
for(int i=0; i < animals.size(); i++) {
System.out.print(animals.get(i));
System.out.print(", ");
}
}
}輸出結(jié)果
LinkedList: [Cow, Cat, Dog] 訪問鏈表元素: Cow, Cat, Dog,
在兩個(gè)示例中,我們都使用循環(huán)訪問鏈表的各個(gè)元素。
3.使用iterator()方法
我們可以使用iterator()方法訪問鏈表的元素。為了使用這種方法,我們必須導(dǎo)入java.util.Iterator包。
import java.util.LinkedList;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
//創(chuàng)建一個(gè)鏈表
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(", ");
}
}
}輸出結(jié)果
LinkedList: [Cow, Cat, Dog] LinkedList使用iterator()方法: Cow, Cat, Dog,
LinkedList和ArrayList都實(shí)現(xiàn)Collections框架的List接口。 但是,它們之間存在一些差異。
| LinkedList | ArrayList |
|---|---|
在單個(gè)位置存儲(chǔ)3個(gè)值(上一個(gè)地址,數(shù)據(jù)和下一個(gè)地址) | 將單個(gè)值存儲(chǔ)在單個(gè)位置 |
提供list的雙鏈接列表實(shí)現(xiàn) | 提供可調(diào)整大小的數(shù)組實(shí)現(xiàn) |
每當(dāng)添加元素時(shí),上一個(gè)和下一個(gè)地址都會(huì)更改 | 每當(dāng)添加元素時(shí),該位置之后的所有元素都會(huì)移動(dòng) |
要訪問元素,我們需要從頭開始迭代到元素 | 可以使用索引隨機(jī)訪問元素。 |