链表(LinkedList)是Java集合框架中的一种常见数据结构,它是一种线性表,但并不会按线性的顺序存储数据,而是在每一个节点中存储下一个节点的地址。链表在Java中主要通过双向链表实现,即每个节点包含三个部分:节点的值、指向下一个节点的链接以及指向前一个节点的链接。
链表的结构
链表可以分为单向链表和双向链表:
- 单向链表:包含两个值,当前节点的值和一个指向下一个节点的链接。
- 双向链表:包含三个值,当前节点的值、指向下一个节点的链接以及指向前一个节点的链接。
在Java中,LinkedList
类是链表结构的主要实现,它继承自AbstractSequentialList
类,并实现了List
接口、Deque
接口和Cloneable
、java.io.Serializable
接口。每个节点通过内部类Node
表示,Node
包含三个成员:节点的值(item
)、指向下一个节点的引用(next
)和指向前一个节点的引用(prev
)。
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
}
LinkedList的特点
- 高效的增删操作:由于链表节点在内存中不连续存储,因此在链表中进行元素的添加和删除操作效率较高,时间复杂度为O(1)(在头尾操作)或O(n)(在中间操作),但不需要像数组那样移动大量元素。
- 低效的查找操作:链表不支持通过下标快速访问元素,查找某个元素需要从头节点开始遍历,时间复杂度为O(n)。
LinkedList的常用方法
- 构造方法:
LinkedList()
:构造一个空列表。LinkedList(Collection<? extends E> c)
:构造一个包含指定集合元素的列表。
- 添加元素:
add(E e)
:将元素添加到链表末尾。addFirst(E e)
:将元素添加到链表开头。addLast(E e)
:将元素添加到链表末尾(与add(E e)
相同)。add(int index, E element)
:在指定位置插入元素。
- 删除元素:
remove()
:移除并返回第一个元素。removeFirst()
:移除并返回第一个元素。removeLast()
:移除并返回最后一个元素。remove(Object o)
:移除指定元素(如果存在)。remove(int index)
:移除指定位置的元素。
- 获取元素:
getFirst()
:返回第一个元素。getLast()
:返回最后一个元素。get(int index)
:返回指定位置的元素。
- 其他方法:
size()
:返回链表中元素的个数。isEmpty()
:检查链表是否为空。contains(Object o)
:检查链表中是否包含指定元素。
-
使用迭代器遍历LinkedList
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
-
使用增强for循环遍历LinkedList
for (String language : linkedList) {
System.out.println(language);
}
-
使用poll方法
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Java");
linkedList.add("Python");
linkedList.add("C++");
String first = linkedList.poll(); // 返回并移除"Java"
String last = linkedList.pollLast(); // 返回并移除"C++"
LinkedList的应用场景
- 频繁在列表开头、中间、末尾等位置进行添加和删除元素操作:由于链表在增删操作上的高效性,它适用于这种场景。
- 不需要快速访问列表中某个元素:如果主要操作是增删而非查找,链表是一个不错的选择。
示例代码
以下是一个简单的示例,展示了如何使用LinkedList
类
LinkedList<String> linkedList= new LinkedList<>();
linkedList.add("Google");
linkedList.add("Runoob");
linkedList.add("Taobao");
// 在头部添加元素
linkedList.addFirst("Wiki");
System.out.println(linkedList); // 输出: [Wiki, Google, Runoob, Taobao]
// 在尾部添加元素
linkedList.addLast("Weibo");
System.out.println(linkedList); // 输出: [Wiki, Google, Runoob, Taobao, Weibo]
// 移除头部元素
linkedList.removeFirst();
System.out.println(linkedList); // 输出: [Google, Runoob, Taobao, Weibo]
// 移除尾部元素
linkedList.removeLast();
System.out.println(linkedList); // 输出: [Google, Runoob, Taobao]
// 获取第一个元素
String first = linkedList.getFirst();
System.out.println("First element: " + first); // 输出: First element: Google
// 获取最后一个元素
String last = linkedList.getLast();
System.out.println("Last element: " + last); // 输出: Last element: Taobao
通过上述内容,我们了解了Java集合框架中的链表(LinkedList
)的基本概念、特点、常用方法以及应用场景。链表是一种非常灵活的数据结构,适用于频繁进行元素增删操作的场景。