LinkedList详解-Deque接口链表实现方案
简介
LinkedList实现了List和Deque接口。List是一个有序的集合,可以包含重复元素,它提供了在列表的头部、尾部或指定位置进行插入、删除和查找等操作的方法。Deque是双端队列,提供了在列表的头部和尾部进行插入和删除操作的方法。通过实现这两个接口,LinkedList可以灵活地用于各种不同的场景,并且可以方便地与其他使用这两个接口的代码进行交互。
在编程中用于存储和操作一系列有序的元素。它是由节点组成的链表,每个节点包含一个数据元素和一个指向下一个节点的指针。LinkedList的主要特点是它的元素可以动态地添加和删除,而且它支持在列表的头部、尾部或指定位置进行插入和删除操作。此外,LinkedList还支持一些其他操作,如查找元素、反转列表等。由于LinkedList是动态数据结构,它非常适合于需要在运行时进行动态调整的数据集合。
主要特点
- 使用双向链表实现,不需要移动元素即可进行插入和删除操作,因此在插入和删除操作上具有较高的效率。
- 支持随机访问,但效率较低,因为需要遍历整个链表来查找元素。
- 由于每个元素都需要存储前驱和后继指针,所以相对于ArrayList等使用数组实现的集合类,LinkedList的存储空间会较大。
- LinkedList直接实现了List接口,使其可以内部存储元素有序并且为每个元素提供索引值。
- LinkedList直接实现了Deque接口,Deque接口继承了Queue,使其可以作为双向链表这种数据结构来使用、操作元素。
- LinkedList直接实现了Cloneable接口,使其可以复制其中的全部元素。
构造函数
- LinkedList():创建一个空的LinkedList。
- LinkedList(Collection<? extends E> c):创建一个包含指定集合中所有元素的LinkedList。
- LinkedList(int capacity):创建一个具有指定容量的LinkedList,以提高内存利用率。
需要注意的是,在创建LinkedList时,需要注意其容量和内存占用情况,以确保LinkedList能够有效地存储和处理数据。
常用方法
- add(E e):在链表后添加一个元素。
- addFirst(E e):在链表头部插入一个元素。
- addLast(E e):在链表尾部添加一个元素。
- push(E e):与addFirst方法一致。
- offer(E e):在链表尾部插入一个元素。
- remove():移除链表中第一个元素。
- remove(E e):移除指定元素。
- removeFirst(E e):删除头,获取元素并删除。
- removeLast(E e):删除尾。
- pollFirst():删除头。
- pollLast():删除尾。
- get(int index):按照下标获取元素。
- getFirst():获取第一个元素。
- getLast():获取最后一个元素。
- peek():获取第一个元素,但是不移除。
- peekFirst():获取第一个元素,但是不移除。
- peekLast():获取最后一个元素,但是不移除。
- poll():查询并移除第一个元素。
这些方法可以满足大部分操作需求,但具体使用哪种方法需要根据实际情况来决定。
使用场景
- 需要频繁地删除、插入数据,且不需要或少用随机访问其中元素的场景 :在这种情况下,LinkedList更快速高效地添加删除元素的能力可以得到充分发挥。
- 需要经常在头部、尾部或指定位置插入或删除元素的场景 :LinkedList支持在列表的头部、尾部或指定位置进行插入和删除操作,因此在这方面具有较高的效率。
例如,在实现一个简单的聊天室时,可以使用LinkedList来存储在线用户的列表,因为在这个场景中,需要频繁地添加和删除用户,而且不需要随机访问用户。
总之,LinkedList适用于需要频繁插入、删除、从头或尾部进行访问的场景。
代码示例
import java.util.LinkedList;public class LinkedListTest {public static void main(String[] args) {// 创建一个空的LinkedListLinkedList<String> list = new LinkedList<>();// 添加元素到LinkedListlist.add("Hello");list.add("World");list.add("!");// 在列表头部添加元素list.addFirst("Start");// 在列表尾部添加元素list.addLast("End");// 打印列表中的元素System.out.println("Elements in the list: " + list);// 移除第一个元素list.removeFirst();// 移除最后一个元素list.removeLast();// 获取列表中的第一个元素String firstElement = list.getFirst();System.out.println("First element: " + firstElement);// 获取列表中的最后一个元素String lastElement = list.getLast();System.out.println("Last element: " + lastElement);}
}
这个示例展示了如何创建一个空的LinkedList,添加元素到列表的头部和尾部,打印列表中的元素,移除第一个和最后一个元素,以及获取列表中的第一个和最后一个元素
注意事项
- 插入和删除操作时,要确保指针的正确性,不要出现死循环或指针丢失的情况。
- 在遍历LinkedList时,不要在遍历过程中对LinkedList进行结构性修改,这可能会导致ConcurrentModificationException异常。
- 注意处理NullPointerException异常,确保LinkedList中不会出现空指针异常。
- 在使用LinkedList时,要明确其适用场景,不要在需要随机访问的场景中使用LinkedList,因为LinkedList的访问效率相对较低。
- 注意内存占用情况,因为LinkedList需要额外的空间来存储节点信息。
- LinkedList是线程不安全的。在多线程环境下,如果多个线程同时对LinkedList进行修改操作(如添加、删除元素),可能会导致数据不一致的问题。因此,在多线程环境下使用LinkedList时,需要额外注意线程安全问题,可以考虑使用Collections.synchronizedList()方法将LinkedList包装成线程安全的列表,或者使用线程安全的ConcurrentLinkedDeque。
相关文章:

LinkedList详解-Deque接口链表实现方案
简介 LinkedList实现了List和Deque接口。List是一个有序的集合,可以包含重复元素,它提供了在列表的头部、尾部或指定位置进行插入、删除和查找等操作的方法。Deque是双端队列,提供了在列表的头部和尾部进行插入和删除操作的方法。通过实现这…...

【考研数据结构代码题1】二叉搜索树的插入与查找
题目:请用C语言写出二叉树的二叉链表结构,并编写一个函数在二叉搜索树中可以搜索给定的关键字 难度:★ 二叉树的二叉链表结构 #include<stdio.h> #include<stdlib.h> //二叉树的结点结构 typedef struct Node{int data;//存放结…...

世微 平均电流型降压恒流驱动器 电动摩托车LED灯小钢炮驱动IC AP5218
1,来源:深圳市世微半导体有限公司 2,产品描述 AP5218 是一款 PWM工作模式, 高效率、外 围简单、内置功率管,适用于5V~100V输入的高 精度降压 LED 恒流驱动芯片。输出最大功率可达 15W,最大电流 1.5A。AP5…...

docker 下安装mysql8.0
在docker中查询mysql镜像 PS C:\Users\admin> docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation……...

Android MVI架构的深入解析与对比
什么是MVI? M:model,此处的model并不是传统的数据模块,它是指用来存储视图状态UI State的一个模块 。比如请求数据时的loading、请求失败的提示页面等UI层面的变化状态。 V:view,视图模块 I:…...

达梦数据库表空间管理常用SQL
达梦数据库表空间管理常用SQL 表空间容量分析表空间创建与扩容 查看数据库状态: select name,instance_name,status$,mode$ from v$instance; --mode$显示Primary为主库select name,status$,role$ from v$database; --status$:1 启动,2 启动…...

Flutter 组件集录 | InheritedNotifier 内置状态管理组件
theme: cyanosis 1. 前言 在上一篇 《Flutter 知识集锦 | 监听与通知 ChangeNotifier》 中,我们介绍了 ChangeNotifier 对象通知监听者的能力。并通过一个简单的模拟下载进度案例,介绍了它的使用方式: | 案例演示 | 监听-通知关系 | | --- | …...

NOIP2023模拟10联测31 涂鸦
题目大意 有一面由 n m n\times m nm个格子组成的墙,每个格子要么是黑色,要么是白色。你每次将会进行这样的操作:等概率随机选择一个位置 ( x , y ) (x,y) (x,y)和一个颜色 c c c(黑色或白色),࿰…...

【Python基础知识一】基本语法、常用数据类型等
Python基础知识: 1 标识符(Identifier)2 关键字/保留字(Keyword)3 引号4 编码5 输入输出6 行与缩进7 多行语句8 注释9 数据类型9.1 数字(Number)类型9.2 变量(variate)9.3 字符串(St…...

听听ChatGPT对IT行业的发展和就业前景的看法
🌈个人主页: Aileen_0v0🔥系列专栏:PYTHON学习系列专栏💫"没有罗马,那就自己创造罗马~" 目录 (1)判断素数 写法1: 写法2: (2)计算1-100的偶数之和 写法1: 写法2: (3)计算1-100的奇数之和 (4)多层循环 IT行业哪个方向比较…...

〖程序员的自我修养 - 认知剖析篇⑤〗- 选择前端还是后端?
人之所以会觉得迷茫,本质上是欠缺对自己的一个控制力、识别庞杂信息、去伪存真的独立思考与认知能力。 说明:该文属于 程序员的自我修养 专栏,购买任意白宝书体系化专栏可加入易编程社区,早鸟价订阅模式除外。福利:加入社区的小伙伴们,除了可以获取博主所有付费专栏的阅读…...

Rust语言初步
文章目录 安装与测试变量条件语句和函数数组和元组循环 安装与测试 可以从官网直接下载。下载rustup-init并运行之后,会打开命令行,选1默认安装,然后不出意外就安装完了。 安装完成后按照惯例查看一下版本,如不报错就算成功。 …...

BIMILLC算法源码解析
论文链接:https://arxiv.org/abs/1607.02533 源码出处:https://github.com/Harry24k/adversarial-attacks-pytorch/tree/master 源码 import torch import torch.nn as nnfrom ..attack import Attackclass BIM(Attack):r"""BIM or iter…...

Android STR研究之五
前言: 在前四篇中初步介绍了开机流程,STR流程,唤醒流程,这里讲下STR的问题点 Android STR研究之一-CSDN博客 Android STR研究之二-CSDN博客 Android STR研究之三-CSDN博客 Android STR研究之四-CSDN博客 问题1:进入STR…...

python3+requests接口自动化测试实例详细操作
前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的…...

在Node.js中,什么是中间件(middleware)?它们的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

当函数参数为一级指针,二级指针
当函数参数为一级指针,二级指针 在讲述内容之前,先讲四点重要知识 1.当传入参数时,函数形参会立即申请形参的内存空间,函数执行完毕后,形参的内存空间立即释放掉。 1.指针是存放其他变量地址的变量。指针有自己的内…...

Hydra post登录框爆破
文章目录 无token时的Hydra post登录框爆破带Token时的Hydra post登录框爆破 无token时的Hydra post登录框爆破 登录一个无验证码和token的页面,同时抓包拦截 取出发送数据包:usernameadb&password133&submitLogin 将用户名和密码替换 userna…...

阿里云推出AI编程工具“通义灵码“;生成式 AI 入门教程 2
🦉 AI新闻 🚀 阿里云推出AI编程工具"通义灵码",支持多种语言及实时续写功能 摘要:阿里云推出了一款名为"通义灵码"的AI编程工具,支持多种主流编程语言,包括Java、Python、Go等。该工…...

使用Qt Installer Framework将自己的程序打包成安装包程序
使用Qt Installer Framework将自己的程序打包成安装包程序 制作安装包程序就是将自己的程序打包成一个可执行的exe,双击之后进行安装。 1. 在制作安装包程序之前需要安装qt官方提供的安装包制作工具Qt Installer Framework 去qt官方网址,下载对应的 Q…...

逆袭Flutter? Facebook 发布全新跨平台引擎 Hermes!
Facebook 于前日发布了新的 JavaScript 引擎:Hermes,专注于提高 React Native 应用的性能,并且在市面上那些内存较少、存储速度较慢且计算能力低下的移动设备上都有良好的表现。但是不是为了追赶Flutter?这块作者没有说明。 移动应…...

c++ 互斥锁使用详解 lock_guard
c 互斥锁使用详解 std::mutex 用于保护共享资源,防止多个线程同时修改共享资源而引发竞争条件。 成员函数 lock:锁定互斥,若互斥不可用则阻塞。try_lock:尝试锁定互斥,若互斥不可用则返回。unlock:解锁…...

【快速解决】Android Button页面跳转功能
目录 让我们直接开始 第一步:先建立一个新的activity 编辑 第二步:打开第一个页面的Java文件MainActivity 方法一:直接跳转功能如下: 方法二:输入密码才能进行跳转功能如下: 需要注意的地方 结语 让…...

C语言 pthread_create
备注void *,最好添加返回值 原因:在实践中,虽然你的函数可能不需要返回任何值,但为了与 pthread_create 函数的预期函数指针格式相匹配,最好遵守函数指针所需的返回类型。这是一种良好的编程实践,确保你的代…...

前端uniapp提交表单调用接口方法最新
目录 源码1源码2最后 源码1 <template><view class"my-add-bank-card"><!-- name"bank_name" form表单提交的input里面一定要加name绑定要传的参数 name"bank_name" type"text" v-model"address.bank_name"…...

OpenFeign的简单介绍和功能实操
前言 本文主要做一下OpenFeign的简单介绍和功能实操,实操主要是OpenFeign的超时和重试,在阅读本文章前,请完成《Nacos 注册中心介绍与实操》内的Nacos多模块生产消费者项目 什么是OpenFeign OpenFeign全名Spring Cloud OpenFeignÿ…...

webpack 高级
高级配置就是要进行 webpack 优化,让代码在编译、运行时性能更好 主要从以下角度去优化: 1、提升开发体验 2、提升打包构建速度 3、减少代码体积 4、优化代码运行性能 一、提升体验 1、SourceMap 为什么 打包出来的所有css和js合并成了一个文件&#…...

OLE DB 访问接口所需的(最大)数据长度为 18,但返回的数据长度为 6。
sqlserver查询oracle链接服务器视图,报错 给最终返回的字符串进行类型转换,字符串大小按返回值最大的那个oracle源本字段类型长度 aaaaaa AS yljgbmcast(aaaaaa AS varchar(10)) AS yljgbm...

oracle (9)Storage Relationship Strut
目录 一、基础知识 1、数据库逻辑结构图 2、Types of Segments 段的类型 3、Storage Clause Precedence 存储条款的优先顺序 4、Extent Alloc & Dealloc 区的范围分配和取消分配 5、 Used and Free Extents 使用和自由区 6、Database Block 数据库块 7、Multiple B…...

React 项目结构小结
React 项目结构小结 简单的记录一下目前 React 项目用的依赖和实现 摸索了大半年了大概构建一套用起来还算轻松的体系……?基本上应该是说可以应对大部分的项目了 使用的依赖 目前项目还在 refactoring 的阶段,所以乱得很,这里是新建一个…...