Java LinkedList(链表)语法知识点及案例代码
一、LinkedList概述
LinkedList是Java集合框架中的一个类,位于java.util
包中。它实现了List、Deque、Queue等接口,提供了链表数据结构的实现。链表是一种线性数据结构,其中每个元素都是一个节点,节点包含数据和指向下一个节点的引用。LinkedList是一个双向链表,每个节点除了指向下一个节点外,还指向前一个节点。
二、LinkedList的特点
- 动态大小:链表的大小是动态变化的,不需要预先分配固定大小的内存。
- 高效的插入和删除操作:在链表中间进行插入和删除操作的时间复杂度为O(1)(在已知节点位置的情况下)。
- 随机访问效率低:访问链表中任意位置的元素需要从头开始遍历,时间复杂度为O(n)。
三、LinkedList的常见方法
-
构造方法
LinkedList()
:创建一个空的LinkedList。LinkedList(Collection<? extends E> c)
:使用指定的集合来创建LinkedList。
-
添加元素
void add(E e)
:在链表末尾添加元素。void add(int index, E element)
:在链表的指定位置插入元素。void addFirst(E e)
:在链表的开头添加元素。void addLast(E e)
:在链表的末尾添加元素。
-
删除元素
E remove()
:删除并返回链表的第一个元素。E remove(int index)
:删除链表中指定位置的元素。boolean remove(Object o)
:删除链表中指定的元素(如果存在)。E removeFirst()
:删除并返回链表的第一个元素。E removeLast()
:删除并返回链表的最后一个元素。
-
访问元素
E get(int index)
:返回链表中指定位置的元素。E getFirst()
:返回链表的第一个元素。E getLast()
:返回链表的最后一个元素。
-
检查元素
boolean contains(Object o)
:检查链表中是否包含指定的元素。
-
查找元素位置
int indexOf(Object o)
:返回链表中第一次出现指定元素的索引位置。int lastIndexOf(Object o)
:返回链表中最后一次出现指定元素的索引位置。
-
其他方法
int size()
:返回链表中元素的数量。void clear()
:清空链表中的所有元素。boolean isEmpty()
:检查链表是否为空。Iterator<E> iterator()
:返回链表的迭代器。ListIterator<E> listIterator()
:返回链表的列表迭代器。ListIterator<E> listIterator(int index)
:返回从指定位置开始的列表迭代器。
四、案例代码
以下是一个简单的Java程序,展示了如何使用LinkedList及其常见方法。
import java.util.LinkedList;
import java.util.Iterator;
import java.util.ListIterator;
public class LinkedListExample {
public static void main(String[] args) {
// 创建一个LinkedList对象
LinkedList<String> linkedList = new LinkedList<>();
// 添加元素到链表末尾
linkedList.add("苹果");
linkedList.add("香蕉");
linkedList.add("橙子");
// 在指定位置插入元素
linkedList.add(1, "葡萄");
// 访问元素
String fruit = linkedList.get(2);
System.out.println("索引为2的元素: " + fruit); // 输出: 索引为2的元素: 葡萄
// 删除元素
String removedFruit = linkedList.remove(0);
System.out.println("移除的元素: " + removedFruit); // 输出: 移除的元素: 苹果
// 获取链表的大小
int size = linkedList.size();
System.out.println("大小: " + size); // 输出: 大小: 3
// 检查链表是否为空
boolean empty = linkedList.isEmpty();
System.out.println("是否为空: " + empty); // 输出: 是否为空: false
// 检查链表是否包含指定元素
boolean contains = linkedList.contains("香蕉");
System.out.println("是否包含香蕉: " + contains); // 输出: 是否包含香蕉: true
// 使用Iterator遍历
Iterator<String> iterator = linkedList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 使用ListIterator遍历和修改
ListIterator<String> listIterator = linkedList.listIterator();
while (listIterator.hasNext()) {
String element = listIterator.next();
if (element.equals("葡萄")) {
listIterator.set("草莓"); // 修改元素
}
}
// 输出修改后的链表
System.out.println("修改后的链表: " + linkedList); // 输出: 修改后的链表: [香蕉, 草莓, 橙子]
// 清空链表
linkedList.clear();
System.out.println("清空后的链表是否为空: " + linkedList.isEmpty()); // 输出: 清空后的链表是否为空: true
}
}
五、总结
LinkedList是一个强大的数据结构,适用于在列表中间频繁进行插入和删除操作的场景。通过掌握其常见方法和特点,可以更加高效地处理链表相关的编程问题。
当然可以,以下是一些关于Java中LinkedList的具体案例,涵盖了LinkedList的构造、元素增删、查找、遍历等操作:
案例一:LinkedList的基本构造与元素增删
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// 构造一个空的LinkedList
LinkedList<Integer> list = new LinkedList<>();
// 尾插法添加元素
list.add(1);
list.add(2);
list.add(3);
// 在指定位置插入元素
list.add(1, 4); // 在索引1的位置插入4
// 删除元素
list.remove(2); // 删除索引为2的元素,即3
list.removeFirst(); // 删除第一个元素,即1
list.removeLast(); // 删除最后一个元素
// 打印链表内容
System.out.println(list); // 输出:[4]
}
}
案例二:LinkedList的查找与修改
import java.util.LinkedList;
public class LinkedListSearchAndModify {
public static void main(String[] args) {
// 构造一个LinkedList并添加元素
LinkedList<String> list = new LinkedList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
// 查找元素
int index = list.indexOf("banana"); // 查找"banana"的索引位置
if (index != -1) {
System.out.println("banana的索引位置是:" + index);
} else {
System.out.println("未找到元素banana");
}
// 修改元素
list.set(1, "blueberry"); // 将索引为1的元素修改为"blueberry"
// 打印链表内容
System.out.println(list); // 输出:[apple, blueberry, cherry]
}
}
案例三:LinkedList的遍历
import java.util.LinkedList;
import java.util.Iterator;
import java.util.ListIterator;
public class LinkedListIteration {
public static void main(String[] args) {
// 构造一个LinkedList并添加元素
LinkedList<String> list = new LinkedList<>();
list.add("dog");
list.add("cat");
list.add("bird");
// 使用普通for循环遍历
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 使用增强for循环遍历
for (String element : list) {
System.out.println(element);
}
// 使用Iterator遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 使用ListIterator遍历,并演示反向遍历
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
System.out.println("反向遍历:");
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
}
}
案例四:LinkedList作为队列使用
import java.util.LinkedList;
public class LinkedListAsQueue {
public static void main(String[] args) {
// 构造一个空的LinkedList作为队列
LinkedList<String> queue = new LinkedList<>();
// 入队操作
queue.addLast("task1");
queue.addLast("task2");
queue.addLast("task3");
// 出队操作并打印
System.out.println(queue.removeFirst()); // 输出:task1
System.out.println(queue.pollFirst()); // 输出:task2,pollFirst在队列为空时返回null,避免异常
// 打印剩余队列内容
System.out.println(queue); // 输出:[task3]
}
}
这些案例展示了LinkedList在Java中的基本用法,包括构造链表、添加和删除元素、查找和修改元素、遍历链表以及将链表作为队列使用等场景。通过这些案例,可以更好地理解和掌握LinkedList的使用。