在 Java 中,链表(LinkedList
)是一个非常重要的数据结构,它可以动态地插入和删除元素,因此比数组更灵活。Java 提供了 LinkedList
类,该类实现了 List
接口,并且是基于双向链表实现的,因此支持高效的插入、删除操作,尤其是在列表的两端。
LinkedList
类位于 java.util
包中,提供了许多用于操作链表的方法。
1. 创建链表
import java.util.LinkedList;
LinkedList<String> list = new LinkedList<>();
2. 链表常用方法及详细说明
2.1 add(E e)
- 功能:将指定的元素添加到链表的末尾。
- 返回类型:
boolean
(对于LinkedList
,始终返回true
) - 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple"); // 添加 "Apple" 到末尾
list.add("Banana"); // 添加 "Banana" 到末尾
System.out.println(list); // 输出: [Apple, Banana]
2.2 addFirst(E e)
- 功能:将指定的元素添加到链表的开头。
- 返回类型:
void
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.addFirst("Orange"); // 将 "Orange" 添加到开头
System.out.println(list); // 输出: [Orange, Apple]
2.3 addLast(E e)
- 功能:将指定的元素添加到链表的末尾。实际上,这与
add()
方法相同,因为LinkedList
是一个双向链表。 - 返回类型:
void
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.addLast("Banana"); // 将 "Banana" 添加到末尾
System.out.println(list); // 输出: [Apple, Banana]
2.4 remove()
- 功能:移除并返回链表的第一个元素。如果链表为空,抛出
NoSuchElementException
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String removed = list.remove(); // 移除并返回第一个元素 "Apple"
System.out.println(removed); // 输出: Apple
System.out.println(list); // 输出: [Banana]
2.5 removeFirst()
- 功能:移除链表的第一个元素。如果链表为空,抛出
NoSuchElementException
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String removedFirst = list.removeFirst(); // 移除第一个元素 "Apple"
System.out.println(removedFirst); // 输出: Apple
System.out.println(list); // 输出: [Banana]
2.6 removeLast()
- 功能:移除链表的最后一个元素。如果链表为空,抛出
NoSuchElementException
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String removedLast = list.removeLast(); // 移除最后一个元素 "Banana"
System.out.println(removedLast); // 输出: Banana
System.out.println(list); // 输出: [Apple]
2.7 get(int index)
- 功能:返回链表中指定位置的元素(基于零索引)。
- 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String element = list.get(1); // 获取索引为 1 的元素 "Banana"
System.out.println(element); // 输出: Banana
2.8 set(int index, E element)
- 功能:替换链表中指定位置的元素。
- 返回类型:
E
(返回被替换的元素) - 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.set(1, "Orange"); // 将索引 1 的元素 "Banana" 替换为 "Orange"
System.out.println(list); // 输出: [Apple, Orange]
2.9 remove(int index)
- 功能:移除链表中指定位置的元素,并返回该元素。
- 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String removedElement = list.remove(1); // 移除索引为 1 的元素 "Banana"
System.out.println(removedElement); // 输出: Banana
System.out.println(list); // 输出: [Apple]
2.10 peek()
- 功能:返回链表的第一个元素,但不移除它。如果链表为空,返回
null
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
String first = list.peek(); // 获取第一个元素 "Apple",但不移除
System.out.println(first); // 输出: Apple
System.out.println(list); // 输出: [Apple]
2.11 peekFirst()
- 功能:返回链表的第一个元素,但不移除它。如果链表为空,返回
null
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
String first = list.peekFirst(); // 获取第一个元素 "Apple"
System.out.println(first); // 输出: Apple
2.12 peekLast()
- 功能:返回链表的最后一个元素,但不移除它。如果链表为空,返回
null
。 - 返回类型:
E
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
String last = list.peekLast(); // 获取最后一个元素 "Banana"
System.out.println(last); // 输出: Banana
2.13 clear()
- 功能:移除链表中的所有元素。
- 返回类型:
void
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.clear(); // 清空链表
System.out.println(list); // 输出: []
2.14 contains(Object o)
- 功能:检查链表中是否包含指定的元素。
- 返回类型:
boolean
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
boolean containsApple = list.contains("Apple"); // true
boolean containsOrange = list.contains("Orange"); // false
System.out.println(containsApple); // true
System.out.println(containsOrange); // false
2.15 size()
- 功能:返回链表中元素的个数。
- 返回类型:
int
- 示例:
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
int size = list.size(); // 2
System.out.println(size); // 2
3. 遍历链表
3.1 使用普通 for
循环遍历
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
3.2 使用增强型 for
循环遍历(foreach)
for (String item : list) {
System.out.println(item);
}
3.3 使用 Iterator
遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
4. 总结
LinkedList
提供了灵活的方式来处理链表中的元素。以下是一些常用的方法:
add()
、addFirst()
、addLast()
:添加元素。remove()
、removeFirst()
、removeLast()
:移除元素。get()
、set()
:访问或修改元素。peek()
、peekFirst()
、`peekLast