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

相关推荐
云梦泽࿐้1 小时前
变量与数据类型:Python世界的基石
开发语言·python
QK_001 小时前
C语言 static 关键字三大作用
c语言·开发语言
lanyxp1 小时前
Sentinel 管不到 SQL 这一层——我写了个 MyBatis SQL 熔断器
java
开发小能手-roy1 小时前
Lambda表达式性能陷阱:避坑指南与JIT编译优化分析
开发语言·python
爱读书的小胖2 小时前
无偿分享ChatGPT Image 2画图网页与并发绘图python程序【Ai绘图】
开发语言·python·chatgpt
慧一居士2 小时前
SpringCloud 微服务Feigin 用的完整调用端和被调用的示例
java·spring cloud
WL学习笔记2 小时前
单项不带头不循环链表
数据结构·链表
CodeStats2 小时前
【虚拟机】 从 CPU 指令到虚拟机隔离:虚拟机就是一个“模拟了完整硬件的普通进程”
java·docker
我命由我123452 小时前
Jetpack Room - Room 查询返回列表无需判空、LIKE 关键字
android·java·开发语言·java-ee·android jetpack·android-studio·android runtime