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

相关推荐
plainGeekDev11 分钟前
ProGuard → R8
android·java·kotlin
带刺的坐椅21 分钟前
把 OpenAPI 接入 Agent Harness:零代码让 Agent 听懂你的 REST API
java·ai·llm·agent·solon·restapi·openapi
༄沐࿆风࿆࿆28 分钟前
JavaScript函数完全指南:从基础语法到闭包原理与应用实战
开发语言·javascript
Geek-Chow1 小时前
微服务认证与授权:01 — 概念
java·前端·数据库
KobeSacre1 小时前
DelayQueue 源码
java·开发语言
Wang's Blog1 小时前
JavaWeb快速入门: Filter与Listener核心详解
java·filter·listener
han_hanker1 小时前
重新认识枚举enum
开发语言
zfoo-framework1 小时前
mongodb性能调优 1.从慢查询分析索引 2.掌握索引最左匹配原则!!!
java
AIGS0011 小时前
企业AI落地:从RAG到AgentRAG的技术跃迁
java·人工智能·人工智能ai大模型应用
鹏易灵2 小时前
C++——8.移动语义初探(移动构造、移动赋值)
开发语言·c++·php