Java LinkedList 详解
LinkedList
是 Java 集合框架中常用的数据结构之一,位于 java.util
包中。它实现了 List
、Deque
和 Queue
接口,是一个双向链表结构,适合频繁的插入和删除操作。
1. LinkedList 的特点
-
数据结构:基于双向链表实现,每个节点包含:
- 数据部分(存储值)。
- 前驱指针(指向前一个节点)。
- 后继指针(指向后一个节点)。
-
实现接口:
List
:支持按索引随机访问、插入和删除操作。Deque
:支持双端队列操作。Queue
:支持队列操作。
-
操作特性:
- 插入和删除效率高:在头部或尾部插入和删除操作的时间复杂度为 O ( 1 ) O(1) O(1)。
- 随机访问效率低:需要遍历链表查找元素,时间复杂度为 O ( n ) O(n) O(n)。
2. LinkedList 的构造方法
LinkedList
提供了以下两种构造方法:
-
无参构造:
LinkedList<Integer> list = new LinkedList<>();
创建一个空的链表。
-
带集合参数的构造:
List<Integer> arrayList = Arrays.asList(1, 2, 3); LinkedList<Integer> list = new LinkedList<>(arrayList);
使用另一个集合初始化链表。
3. 常用方法
LinkedList
继承了 List
和 Deque
的所有方法。以下是常用方法的分类及示例:
3.1 添加元素
- 尾部添加:
list.add(10); // 在尾部添加元素
- 指定位置添加:
list.add(1, 20); // 在索引 1 处插入元素 20
- 头部添加:
list.addFirst(5); // 在头部添加元素
- 尾部添加:
list.addLast(15); // 在尾部添加元素
3.2 删除元素
- 删除头部元素:
list.removeFirst(); // 删除并返回头部元素
- 删除尾部元素:
list.removeLast(); // 删除并返回尾部元素
- 删除指定位置元素:
list.remove(2); // 删除索引 2 处的元素
- 删除指定值:
list.remove(Integer.valueOf(10)); // 删除第一个匹配值为 10 的元素
3.3 获取元素
- 头部或尾部元素:
list.getFirst(); // 返回头部元素 list.getLast(); // 返回尾部元素
- 指定位置元素:
list.get(2); // 返回索引 2 处的元素
3.4 检查元素
- 是否包含某个元素:
list.contains(20); // 检查链表是否包含值为 20 的元素
- 是否为空:
list.isEmpty(); // 检查链表是否为空
3.5 迭代元素
- 普通 for 循环:
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i)); }
- 增强 for 循环:
for (Integer num : list) {System.out.println(num); }
- 使用迭代器:
Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) {System.out.println(iterator.next()); }
3.6 双端队列操作
LinkedList
实现了 Deque
接口,支持双端队列的操作。
- 入队(头部或尾部):
list.offerFirst(1); // 在头部添加元素 list.offerLast(2); // 在尾部添加元素
- 出队(头部或尾部):
list.pollFirst(); // 删除并返回头部元素 list.pollLast(); // 删除并返回尾部元素
3.7 栈操作
LinkedList
也可以用作栈,支持栈的基本操作。
- 压栈:
list.push(10); // 将元素压入栈顶(头部)
- 出栈:
list.pop(); // 弹出栈顶元素(头部)
4. 示例代码
以下是一个综合使用 LinkedList
的示例:
import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<>();// 添加元素list.add(10);list.add(20);list.add(30);list.addFirst(5);list.addLast(40);System.out.println("链表内容: " + list);// 删除元素list.removeFirst();list.removeLast();list.remove(Integer.valueOf(20));System.out.println("删除元素后的链表: " + list);// 获取元素System.out.println("头部元素: " + list.getFirst());System.out.println("尾部元素: " + list.getLast());// 检查元素System.out.println("是否包含 30: " + list.contains(30));// 使用栈操作list.push(50); // 压栈System.out.println("压栈后的链表: " + list);list.pop(); // 出栈System.out.println("出栈后的链表: " + list);// 使用队列操作list.offerFirst(5); // 入队头部list.offerLast(60); // 入队尾部System.out.println("使用队列操作后的链表: " + list);// 遍历元素System.out.println("遍历链表:");for (Integer num : list) {System.out.println(num);}}
}
输出:
链表内容: [5, 10, 20, 30, 40]
删除元素后的链表: [10, 30]
头部元素: 10
尾部元素: 30
是否包含 30: true
压栈后的链表: [50, 10, 30]
出栈后的链表: [10, 30]
使用队列操作后的链表: [5, 10, 30, 60]
遍历链表:
5
10
30
60
5. LinkedList 的时间复杂度
操作 | 时间复杂度 | 原因 |
---|---|---|
插入(头部/尾部) | O ( 1 ) O(1) O(1) | 双向链表操作,直接修改指针即可 |
删除(头部/尾部) | O ( 1 ) O(1) O(1) | 双向链表操作,直接修改指针即可 |
按索引访问元素 | O ( n ) O(n) O(n) | 需要从头部或尾部遍历到指定位置 |
查找某个元素 | O ( n ) O(n) O(n) | 遍历整个链表 |
插入/删除(中间位置) | O ( n ) O(n) O(n) | 需要先遍历找到位置,然后修改指针 |
6. LinkedList 的优缺点
优点:
- 适合频繁插入和删除操作。
- 实现了多种接口(
List
、Deque
、Queue
),功能强大。 - 支持双端操作(头部和尾部操作都高效)。
缺点:
- 随机访问性能差,需要遍历链表,时间复杂度为 O ( n ) O(n) O(n)。
- 占用额外的内存空间(指针存储前驱和后继节点)。
7. 总结
-
适用场景:
- 数据插入和删除频繁的场景(如队列、栈操作)。
- 数据大小较小,链表的额外内存开销可以接受。
-
不适用场景:
- 随机访问频繁的场景(推荐使用
ArrayList
)。
- 随机访问频繁的场景(推荐使用
通过合理选择数据结构,可以根据具体需求提高程序性能和代码效率。
相关文章:
Java LinkedList 详解
LinkedList 是 Java 集合框架中常用的数据结构之一,位于 java.util 包中。它实现了 List、Deque 和 Queue 接口,是一个双向链表结构,适合频繁的插入和删除操作。 1. LinkedList 的特点 数据结构:基于双向链表实现,每个…...
mac-mini的时间机器,数据备份到alist 中的网盘
苹果的时间机器不能直接将备份存储在 alist 上的网盘,但可以通过一些中间步骤来实现类似的效果,以下是具体介绍: 方法原理 通过将支持 WebDAV 协议的网络存储挂载到本地,再将其设置为时间机器的备份磁盘,从而间接实现…...
【HarmonyOS】鸿蒙应用加载读取csv文件
【HarmonyOS】鸿蒙应用加载读取csv文件 一、问题背景: 1. csv文件是什么? csv是一种文本文件格式,与json类似。会存储一些文本内容,应用需要读取该文件,进行UI内容得填充等。 文件中的数据是以纯文本形式存储的&…...
Java retainAll() 详解
在 Java 中,retainAll() 是 Collection 接口(List、Set 等集合类实现该接口)的一种方法,用于保留集合中与指定集合交集的元素,删除其他所有元素。 以下是对 retainAll() 方法的详细讲解。 1. 方法定义 方法签名 boo…...

Redis的基本数据类型
初识Redis缓存 Redis缓存: 实际开发中经常使用Redis作为缓存数据库,从而提高数据存取效率,减轻后端数据库的压力。 可以将经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到MyS…...

通过vite+vue3+pinia从0到1搭建一个uniapp应用
最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…...
Linux的桌面
Linux的桌面是可以卸载的 的确,Linux并不像Windows,Linux本身是一个基于命令行的操作系统,在内核眼中,桌面只不过是个普通的应用程序,所以,在Linux的桌面中可以完成的事情,命令行中也基本可以完…...

Easyexcel(5-自定义列宽)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽) 注解 ColumnWidth Data…...

操作系统实验 C++实现死锁检测算法
实验目的 模拟实现死锁检测算法 实验内容 1、 输入: “资源分配表”文件,每一行包含资源编号、进程编号两项(均用整数表示,并用空格分隔开),记录资源分配给了哪个进程。 “进程等待表”文件&…...

小鹏汽车智慧材料数据库系统项目总成数据同步
1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构: 这几个表总数为100多万,经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图: 界面: SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…...

1、HCIP之RSTP协议与STP相关安全配置
目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…...
Linux云服务器docker使用教程
诸神缄默不语-个人CSDN博文目录 我用的是腾讯云服务器,操作系统是OpenCloudOS 9,基本上可以当特色版CentOS用。 docker安装跟各个系统关系太大了,我就不写了。OpenCloudOS 9安装docker见这篇博文:腾讯云服务器使用教程 文章目录 …...
如何从android的webview 取得页面上的数据
要从Android的WebView中获取页面上的数据,通常有几种常见的方法: JavaScript Interface:通过JavaScript和Android Interface进行通信。这种方法允许你在JavaScript中调用Android的方法,反之亦然。 Evaluate JavaScriptÿ…...

VTK知识学习(12)- 读取PNG图像
1、代码 private void ShowPngImage(){vtkPNGReader pngReader vtkPNGReader.New();pngReader.SetFileName("D:\\图像\\boxes\\cardboard_boxes_01.png");pngReader.Update();vtkImageActor imageActor vtkImageActor.New();imageActor.SetInputData(pngReader.Get…...

Springboot项目搭建(3)-更改用户信息与文件上传
1.概要 前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。 这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等... 而后接触到了本地上传和云上传,其二者区别: 选择本地上传还是云上…...

Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …...
android 如何获取当前 Activity 的类名和包名
其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…...
Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...

uniapp 城市选择插件
uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...