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…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
