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 是链表,适合头尾添加删除,也经常用来实现队列。

相关推荐
腻害兔9 分钟前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊33 分钟前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
Yeauty1 小时前
渲染成图再 CLI 拼接,还是进程内直推?Rust 帧到视频的两条路
开发语言·rust·音视频
geovindu2 小时前
CSharp: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·算法·c#·.net·搜索算法
景同学2 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
库克克2 小时前
【C++】set 与multiset
开发语言·c++
Wang's Blog2 小时前
Go-Zero项目开发34: 微服务超时控制与重试机制实践
开发语言·微服务·golang·go-zero
C++、Java和Python的菜鸟2 小时前
第7章 后端Web实战(Tlias系统)
java
憧憬成为java架构高手的小白3 小时前
黑马八股--spring框架学习
java·学习·spring
唐青枫3 小时前
Java Picocli 实战详解:用注解写出好用的命令行工具
java