Java集合框架中的LinkedList
类提供了链表数据结构(双向链表)的功能。

链表中的每个元素都称为一个**节点**。它包含 3 个字段:
- **Prev** - 存储列表中前一个元素的地址。对于第一个元素,它为
null
。 - **Next** - 存储列表中下一个元素的地址。对于最后一个元素,它为
null
。 - **Data** - 存储实际数据。
创建Java LinkedList
以下是在Java中创建链表的方法:
LinkedList<Type> linkedList = new LinkedList<>();
在此,Type表示链表的类型。例如:
// create Integer type linked list
LinkedList<Integer> linkedList = new LinkedList<>();
// create String type linked list
LinkedList<String> linkedList = new LinkedList<>();
示例:在Java中创建LinkedList
import java.util.LinkedList;
class Main {
public static void main(String[] args){
// create linkedlist
LinkedList<String> animals = new LinkedList<>();
// Add elements to LinkedList
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
}
}
输出
LinkedList: [Dog, Cat, Cow]
在上面的示例中,我们创建了一个名为animals的LinkedList
。
在这里,我们使用了add()
方法向LinkedList添加元素。我们将在本教程后面详细介绍add()
方法。
Java LinkedList的工作原理
链表中的元素不是按顺序存储的。相反,它们被分散开,并通过链接(**Prev**和**Next**)连接。

这里我们在链表中包含 3 个元素:
- Dog - 它是第一个元素,其前向地址为null,后向地址为Cat的地址。
- Cat - 它是第二个元素,其前向地址为Dog的地址,后向地址为Cow的地址。
- Cow - 它是最后一个元素,其前向地址为Cat的地址,后向地址为null。
如需了解更多信息,请访问LinkedList数据结构。
Java LinkedList的方法
LinkedList
提供了多种方法,可用于在链表中执行各种操作。在本教程中,我们将介绍四种最常用的LinkedList运算符:
- 添加元素
- 访问元素
- 更改元素
- 删除元素
1. 向LinkedList添加元素
我们可以使用add()
方法将元素(节点)添加到LinkedList的末尾。例如:
import java.util.LinkedList;
class Main {
public static void main(String[] args){
// create linkedlist
LinkedList<String> animals = new LinkedList<>();
// add() method without the index parameter
animals.add("Dog");
animals.add("Cat");
animals.add("Cow");
System.out.println("LinkedList: " + animals);
// add() method with the index parameter
animals.add(1, "Horse");
System.out.println("Updated LinkedList: " + animals);
}
}
输出
LinkedList: [Dog, Cat, Cow] Updated LinkedList: [Dog, Horse, Cat, Cow]
在上面的示例中,我们创建了一个名为animals的LinkedList。在这里,我们使用了add()
方法向animals添加元素。
请注意以下语句:
animals.add(1, "Horse");
这里,我们使用了**索引号**参数。这是一个可选参数,指定添加新元素的位置。
要了解有关向LinkedList添加元素的更多信息,请访问Java程序向LinkedList添加元素。
2. 访问LinkedList元素
LinkedList类的get()
方法用于从LinkedList访问元素。例如:
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
LinkedList<String> languages = new LinkedList<>();
// add elements in the linked list
languages.add("Python");
languages.add("Java");
languages.add("JavaScript");
System.out.println("LinkedList: " + languages);
// get the element from the linked list
String str = languages.get(1);
System.out.print("Element at index 1: " + str);
}
}
输出
LinkedList: [Python, Java, JavaScript] Element at index 1: Java
在上面的示例中,我们使用了带有参数**1**的get()
方法。这里,该方法返回索引**1**处的元素。
我们还可以使用iterator()
和listIterator()
方法访问LinkedList的元素。要了解更多信息,请访问Java程序访问LinkedList的元素。
3. 更改LinkedList的元素
LinkedList
类的set()
方法用于更改LinkedList的元素。例如:
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
LinkedList<String> languages = new LinkedList<>();
// add elements in the linked list
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Java");
System.out.println("LinkedList: " + languages);
// change elements at index 3
languages.set(3, "Kotlin");
System.out.println("Updated LinkedList: " + languages);
}
}
输出
LinkedList: [Java, Python, JavaScript, Java] Updated LinkedList: [Java, Python, JavaScript, Kotlin]
在上面的示例中,我们创建了一个名为languages的LinkedList。请注意以下行:
languages.set(3, "Kotlin");
这里,set()
方法将索引**3**处的元素更改为Kotlin。
4. 从LinkedList中删除元素
LinkedList
类的remove()
方法用于从LinkedList中删除元素。例如:
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
LinkedList<String> languages = new LinkedList<>();
// add elements in LinkedList
languages.add("Java");
languages.add("Python");
languages.add("JavaScript");
languages.add("Kotlin");
System.out.println("LinkedList: " + languages);
// remove elements from index 1
String str = languages.remove(1);
System.out.println("Removed Element: " + str);
System.out.println("Updated LinkedList: " + languages);
}
}
输出
LinkedList: [Java, Python, JavaScript, Kotlin] Removed Element: Python New LinkedList: [Java, JavaScript, Kotlin]
这里,remove()
方法将索引号作为参数。它会删除由索引号指定的元素。
要了解有关从LinkedList中删除元素的更多信息,请访问Java程序删除LinkedList的元素。。
其他方法
方法 | 描述 |
---|---|
contains() |
检查LinkedList是否包含该元素 |
indexOf() |
返回元素第一次出现的索引 |
lastIndexOf() |
返回元素最后一次出现的索引 |
clear() |
删除LinkedList的所有元素 |
iterator() |
返回一个迭代器以遍历LinkedList |
LinkedList作为Deque和Queue
由于LinkedList
类还实现了Queue和Deque接口,因此它也可以实现这些接口的方法。以下是一些常用方法:
方法 | 描述 |
---|---|
addFirst() |
将指定的元素添加到链表的开头 |
addLast() |
将指定的元素添加到链表的末尾 |
getFirst() |
返回第一个元素 |
getLast() |
返回最后一个元素 |
removeFirst() |
删除第一个元素 |
removeLast() |
删除最后一个元素 |
peek() |
返回链表的第一个元素(头) |
poll() |
返回并删除链表的第一个元素 |
offer() |
将指定的元素添加到链表的末尾 |
示例:Java LinkedList作为Queue
import java.util.LinkedList;
import java.util.Queue;
class Main {
public static void main(String[] args) {
Queue<String> languages = new LinkedList<>();
// add elements
languages.add("Python");
languages.add("Java");
languages.add("C");
System.out.println("LinkedList: " + languages);
// access the first element
String str1 = languages.peek();
System.out.println("Accessed Element: " + str1);
// access and remove the first element
String str2 = languages.poll();
System.out.println("Removed Element: " + str2);
System.out.println("LinkedList after poll(): " + languages);
// add element at the end
languages.offer("Swift");
System.out.println("LinkedList after offer(): " + languages);
}
}
输出
LinkedList: [Python, Java, C] Accessed Element: Python Removed Element: Python LinkedList after poll(): [Java, C] LinkedList after offer(): [Java, C, Swift]
示例:LinkedList作为Deque
import java.util.LinkedList;
import java.util.Deque;
class Main {
public static void main(String[] args){
Deque<String> animals = new LinkedList<>();
// add element at the beginning
animals.add("Cow");
System.out.println("LinkedList: " + animals);
animals.addFirst("Dog");
System.out.println("LinkedList after addFirst(): " + animals);
// add elements at the end
animals.addLast("Zebra");
System.out.println("LinkedList after addLast(): " + animals);
// remove the first element
animals.removeFirst();
System.out.println("LinkedList after removeFirst(): " + animals);
// remove the last element
animals.removeLast();
System.out.println("LinkedList after removeLast(): " + animals);
}
}
输出
LinkedList: [Cow] LinkedList after addFirst(): [Dog, Cow] LinkedList after addLast(): [Dog, Cow, Zebra] LinkedList after removeFirst(): [Cow, Zebra] LinkedList after removeLast(): [Cow]
遍历LinkedList
我们可以使用Java for-each循环来遍历LinkedList。例如:
import java.util.LinkedList;
class Main {
public static void main(String[] args) {
// Creating a linked list
LinkedList<String> animals = new LinkedList<>();
animals.add("Cow");
animals.add("Cat");
animals.add("Dog");
System.out.println("LinkedList: " + animals);
// Using forEach loop
System.out.println("Accessing linked list elements:");
for(String animal: animals) {
System.out.print(animal);
System.out.print(", ");
}
}
}
输出
LinkedList: [Cow, Cat, Dog] Accessing linked list elements: Cow, Cat, Dog,
LinkedList 与 ArrayList 对比
Java ArrayList和LinkedList
都实现了Collections
框架的List
接口。但是,它们之间存在一些差异。
LinkedList | ArrayList |
---|---|
实现了List 、Queue 和Deque 接口。 |
实现了List 接口。 |
在单个位置存储 3 个值(**前向地址**、**数据**和**后向地址**)。 | 在单个位置存储单个值。 |
提供双向链表实现。 | 提供可调整大小的数组实现。 |
添加元素时,会更改prev 和next 地址。 |
添加元素时,会移动该位置之后的所有元素。 |
要访问元素,需要从头开始迭代到该元素。 | 可以通过索引随机访问元素。 |
注意:我们也可以使用接口在Java中创建LinkedList。例如:
// create linkedlist using List
List<String> animals1 = new LinkedList<>();
// creating linkedlist using Queue
Queue<String> animals2 = new LinkedList<>();
// creating linkedlist using Deque
Deque<String> animals3 = new LinkedList<>();
在这里,如果LinkedList是通过一个接口创建的,那么我们就不能使用其他接口提供的特定方法。也就是说,animals1不能使用Queue
和Deque
接口特有的方法。