Java 集合 LinkedList 详解:链表结构、常用方法和队列使用

文章目录

    • 一、什么是链表?
    • [二、LinkedList 是什么?](#二、LinkedList 是什么?)
    • [三、LinkedList 的基本使用](#三、LinkedList 的基本使用)
      • [1. 添加元素](#1. 添加元素)
      • [2. 添加到开头](#2. 添加到开头)
      • [3. 添加到末尾](#3. 添加到末尾)
      • [4. 获取第一个元素](#4. 获取第一个元素)
      • [5. 获取最后一个元素](#5. 获取最后一个元素)
      • [6. 删除第一个元素](#6. 删除第一个元素)
      • [7. 删除最后一个元素](#7. 删除最后一个元素)
    • [四、LinkedList 也可以当队列使用](#四、LinkedList 也可以当队列使用)
    • 五、队列常用方法
    • [六、LinkedList 常见使用场景](#六、LinkedList 常见使用场景)
    • [七、LinkedList 和 ArrayList 简单区别](#七、LinkedList 和 ArrayList 简单区别)
    • 八、总结

在 Java 中, LinkedList 是一个常见的集合类,中文一般叫 链表

它可以像普通列表一样存放数据,也可以当作队列使用。比如我们经常会看到这样的代码:

java 复制代码
Queue<int[]> queue = new LinkedList<>();

这行代码的意思是:

LinkedList 创建了一个队列对象。


一、什么是链表?

链表是一种用来存储数据的数据结构。

通俗理解:

链表不是把数据连续放在一起,而是一个节点连着一个节点。

每个节点里面通常包含两部分:

复制代码
数据 + 下一个节点的位置

可以想象成一串火车:

复制代码
[数据1] -> [数据2] -> [数据3] -> [数据4]

每一节车厢里都有数据,并且知道下一节车厢在哪里。

所以,链表的核心特点就是:

复制代码
一个节点连接一个节点

二、LinkedList 是什么?

LinkedList 是 Java 提供的链表集合类,使用前需要导包:

java 复制代码
import java.util.LinkedList;

创建一个 LinkedList

java 复制代码
LinkedList<String> list = new LinkedList<>();

这表示创建了一个链表,里面存放的是字符串类型的数据。


三、LinkedList 的基本使用

1. 添加元素

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("Java");
list.add("MySQL");
list.add("Redis");

System.out.println(list);

输出结果:

复制代码
[Java, MySQL, Redis]

可以理解为:

复制代码
Java -> MySQL -> Redis

2. 添加到开头

java 复制代码
list.addFirst("Spring Boot");

示例:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("MySQL");
list.add("Redis");

list.addFirst("Spring Boot");

System.out.println(list);

输出:

复制代码
[Spring Boot, MySQL, Redis]

3. 添加到末尾

java 复制代码
list.addLast("Docker");

示例:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("Java");
list.add("MySQL");

list.addLast("Docker");

System.out.println(list);

输出:

复制代码
[Java, MySQL, Docker]

其实 add() 默认也是添加到末尾。


4. 获取第一个元素

java 复制代码
System.out.println(list.getFirst());

示例:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("Java");
list.add("MySQL");
list.add("Redis");

System.out.println(list.getFirst());

输出:

复制代码
Java

5. 获取最后一个元素

java 复制代码
System.out.println(list.getLast());

输出:

复制代码
Redis

6. 删除第一个元素

java 复制代码
list.removeFirst();

示例:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("Java");
list.add("MySQL");
list.add("Redis");

list.removeFirst();

System.out.println(list);

输出:

复制代码
[MySQL, Redis]

7. 删除最后一个元素

java 复制代码
list.removeLast();

示例:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("Java");
list.add("MySQL");
list.add("Redis");

list.removeLast();

System.out.println(list);

输出:

复制代码
[Java, MySQL]

四、LinkedList 也可以当队列使用

LinkedList 不仅可以当普通列表用,也可以当队列用。

队列的特点是:

复制代码
先进先出

也就是:

先放进去的数据,先被取出来。

示例:

java 复制代码
import java.util.LinkedList;
import java.util.Queue;

public class QueueDemo {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();

        queue.offer("张三");
        queue.offer("李四");
        queue.offer("王五");

        System.out.println(queue.poll());
        System.out.println(queue.poll());
        System.out.println(queue.poll());
    }
}

输出:

复制代码
张三
李四
王五

执行过程可以理解为:

复制代码
入队:张三 -> 李四 -> 王五

第一次 poll:取出张三
第二次 poll:取出李四
第三次 poll:取出王五

五、队列常用方法

LinkedList 当作队列使用时,常用方法有这几个:

java 复制代码
offer()    // 入队
poll()     // 出队,并删除元素
peek()     // 查看队头元素,但不删除
isEmpty()  // 判断队列是否为空

示例:

java 复制代码
Queue<String> queue = new LinkedList<>();

queue.offer("A");
queue.offer("B");
queue.offer("C");

System.out.println(queue.peek()); // A,只查看,不删除
System.out.println(queue.poll()); // A,取出并删除
System.out.println(queue);        // [B, C]

六、LinkedList 常见使用场景

LinkedList 常见使用场景主要有两个。

第一个是当普通链表使用:

java 复制代码
LinkedList<String> list = new LinkedList<>();

list.add("A");
list.add("B");
list.add("C");

第二个是当队列使用:

java 复制代码
Queue<String> queue = new LinkedList<>();

queue.offer("A");
queue.offer("B");

String value = queue.poll();

在算法题中,LinkedList 经常用于 BFS 广度优先搜索:

java 复制代码
Queue<int[]> queue = new LinkedList<>();

queue.offer(new int[]{0, 0});

while (!queue.isEmpty()) {
    int[] cur = queue.poll();

    int x = cur[0];
    int y = cur[1];

    System.out.println(x + "," + y);
}

这里的 int[] 可以理解为一个坐标,比如:

java 复制代码
new int[]{0, 0}

表示坐标 (0, 0)


七、LinkedList 和 ArrayList 简单区别

ArrayList 底层更像数组,适合按照下标查询。

java 复制代码
list.get(0);
list.get(1);
list.get(2);

LinkedList 底层是链表,适合在头部、尾部进行添加和删除。

java 复制代码
list.addFirst("A");
list.removeFirst();
list.addLast("B");
list.removeLast();

简单记忆:

复制代码
经常查询:优先考虑 ArrayList
经常头尾添加删除:可以考虑 LinkedList
需要队列:可以使用 Queue + LinkedList

八、总结

LinkedList 是 Java 中的链表集合类。

它的核心特点是:

复制代码
一个节点连接一个节点

可以理解为:

复制代码
数据1 -> 数据2 -> 数据3 -> 数据4

常见用法有两个:

复制代码
1. 当普通链表使用
2. 当队列 Queue 使用

普通链表写法:

java 复制代码
LinkedList<String> list = new LinkedList<>();

队列写法:

java 复制代码
Queue<String> queue = new LinkedList<>();

队列常用方法:

java 复制代码
queue.offer();   // 入队
queue.poll();    // 出队并删除
queue.peek();    // 查看队头
queue.isEmpty(); // 判断是否为空

一句话记住:

LinkedList 是链表,适合头尾添加删除,也经常用来实现队列。

相关推荐
wuyk5558 分钟前
第 6 章 FOC 完整系统整合:从算法到真机跑起来
c语言·开发语言·stm32·单片机·嵌入式硬件
luj_176812 分钟前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场13 分钟前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维
东华万里16 分钟前
第40篇 C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·大学生专区
AC赳赳老秦19 分钟前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw
程序员雷欧32 分钟前
AQS深度解析
开发语言·python
Java成神之路-43 分钟前
深入理解三大高频队列:ArrayDeque、LinkedList、PriorityQueue 方法、特性与场景选择
java
roman_日积跬步-终至千里1 小时前
【资源控制】自助查询的智能路由
java·大数据·数据库
步行cgn1 小时前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
yujunl1 小时前
总结一下U9客开的成果
开发语言