Java常用API之LinkedList类解读
写在开头:本文用于作者学习我将官方文档中LinkedList 1.6版本中类中绝大部分API全测了一遍并打印了结果,日拱一卒,常看常新。
自己补充了一些对该数据结构的理解,如有不对的地方,请各位指正,谢谢。
首先,LinkedList是一个链表结构,往它里面添加数据的时候,它会自动帮你记录每个元素的位置,记载它的nex(指针)t里面。
相比数组而言,它就像一个有很多节的火车(装载量可变),数组有点像货车(装载量不可变),可以通过如下代码定义一个简单的链表结构
补充:定义单向链表的节点类
class ListNode {//定义链表结构,属性一int value记录值(载重),ListNode next记录下一节点(车厢)的位置int val;//数据域ListNode next;//指针域, next表示指针,表示下一个节点是谁
}
它里面有两个属性要被定义,一个是数据域,用来存链表中的数据;一个是指针域,用来指向它下一个节点的内存地址。
先定义双向链表的节点类
public class Node {//定义节点类int data;Node prev;//指向前一个位置Node next;//后一个位置public Node(int data) {//构造函数this.data = data;this.prev = null;this.next = null;}
}
再定义个双向链表类
public class DoublyLinkedList {Node head;//head变量类型为Node类,前面定义节点类就为了这,用于存储链表头节点的引用public DoublyLinkedList() {this.head = null;}// 添加元素到链表末尾public void add(int data) {Node newNode = new Node(data);if (head == null) {head = newNode;// 如果链表为空,新节点成为头节点} else {//如果链表不为空Node current = head;// 将头节点先赋给当前节点while (current.next != null) {//再判断当前节点的下一个索引是否为空,不为空继续遍历current = current.next;//直到当前节点的下个索引指向空,退出循环}current.next = newNode;//将当前节点索引指向新节点newNode.prev = current;//将新节点的上一个索引指向当前节点}}// 删除指定元素public void remove(int data) {if (head == null) return;Node current = head;while (current != null) {if (current.data == data) {if (current.prev != null) {current.prev.next = current.next;} else {head = current.next;}if (current.next != null) {current.next.prev = current.prev;}return;}current = current.next;}}// 打印链表public void printList() {Node current = head;while (current != null) {System.out.print(current.data + " ");current = current.next;}System.out.println();}public static void main(String[] args) {DoublyLinkedList dll = new DoublyLinkedList();dll.add(10);dll.add(20);dll.add(30);dll.printList(); // 打印: 10 20 30dll.remove(20);dll.printList(); // 打印: 10 30}
}
下面是一些它的方法:
add() 末尾添加元素
@Testpublic void test_add(){// 将指定元素添加到此列表的结尾LinkedList<Character> a = new LinkedList<Character>() {{add('a');}};System.out.println(a);//[a]}
addIndex() 指定索引添加元素
@Testpublic void test_addIndex(){//在此列表中指定的位置插入指定的元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');add(0,'b');}};System.out.println(a);//[b, a]}
addAll() 往里加一个集合
@Testpublic void test_addAll(){// 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序LinkedList<Character> b = new LinkedList<Character>() {{add('^');}};LinkedList<Character> a = new LinkedList<Character>() {{add('a');add(0,'b');addAll(b);}};System.out.println(a);//[b, a, ^]}
addFirst() 头位置添加
@Testpublic void test_addFirst(){//将指定元素插入此列表的开头LinkedList<Character> a = new LinkedList<Character>() {{add('a');addFirst('c');}};System.out.println(a);//[c, a]}
addLast() 末尾添加
@Testpublic void test_addLast(){//将指定元素添加到此列表的结尾LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};System.out.println(a);//[a, d]}
clear()
@Testpublic void test_clear(){//从此列表中移除所有元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};a.clear();System.out.println(a);//[]}
clone()
@Testpublic void test_clone(){//返回此 LinkedList 的浅表副本LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Object clone = a.clone();System.out.println(clone);//[a, d]}
contains() 是否包含
@Testpublic void test_contains(){//如果此列表包含指定元素,则返回 trueLinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};boolean a1 = a.contains('a');System.out.println(a1);//true}
element() 获取但不移除头元素
@Testpublic void test_element(){//获取但不移除此列表的头(第一个元素)。LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character element = a.element();System.out.println(element);//aSystem.out.println(a);//[a, d]}
get() 按索引取值
@Testpublic void test_get(){//获取但不移除此列表的头(第一个元素)。LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character character = a.get(1);System.out.println(character);//d}
getFirst()
@Testpublic void test_getFirst(){//获取但不移除此列表的头(第一个元素)。LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character first = a.getFirst();System.out.println(first);//a}
getLast()
@Testpublic void test_getLast(){//获取但不移除此列表的头(第一个元素)。LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character last = a.getLast();System.out.println(last);//d}
indexOf() 按值取索引
@Testpublic void test_indexOf(){//返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};int index = a.indexOf('a');System.out.println(index);//0}
lastIndexOf() 最后位置出现的索引
@Testpublic void test_lastIndexOf(){//返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};int index = a.lastIndexOf('a');System.out.println(index);//0}
listIterator() 迭代器
@Testpublic void test_listIterator(){//返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};ListIterator<Character> iterator = a.listIterator(1);if(iterator.hasNext()){System.out.println(iterator.next());//d}}
peek() 取第一个
@Testpublic void test_peek(){//获取但不移除此列表的头(第一个元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');add('b');addLast('d');}};Character peek = a.peek();System.out.println(peek);//a}
poll() 取第一个
@Testpublic void test_poll(){//获取并移除此列表的头(第一个元素)LinkedList<Character> a = new LinkedList<Character>() {{add('a');add('b');addLast('d');}};Character poll = a.poll();System.out.println(a);//[b, d]}
pop() 取第一个
@Testpublic void test_pop(){//从此列表所表示的堆栈处弹出一个元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');add('b');addLast('d');}};Character pop = a.pop();System.out.println(pop);//aSystem.out.println(a);//[b, d]}
remove() 移除指定索引元素
@Testpublic void test_remove(){// 移除此列表中指定位置处的元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');add('b');addLast('d');}};a.remove(1);System.out.println(a);//[a, d]}
removeFirst() 移除第一个
@Testpublic void test_removeFirst(){//移除并返回此列表的第一个元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character character = a.removeFirst();System.out.println(character);//a}
removeLast() 移除最后一个
@Testpublic void test_removeLast(){//移除并返回此列表的最后一个元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character character = a.removeLast();System.out.println(character);//d}
set() 赋值
@Testpublic void test_set(){//将此列表中指定位置的元素替换为指定的元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Character e = a.set(1, 'e');// Character e1 = a.set(2, 'e');越界了System.out.println(a);//[a, e]}
size() 取大小
@Testpublic void test_size(){//将此列表中指定位置的元素替换为指定的元素LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};System.out.println(a.size());//2}
toArray() 转数组
@Testpublic void test_toArray(){//返回以适当顺序(从第一个元素到最后一个元素)包含此列表中所有元素的数组LinkedList<Character> a = new LinkedList<Character>() {{add('a');addLast('d');}};Object[] objects = a.toArray();System.out.println(objects[1]);//d}
相关文章:
Java常用API之LinkedList类解读
写在开头:本文用于作者学习我将官方文档中LinkedList 1.6版本中类中绝大部分API全测了一遍并打印了结果,日拱一卒,常看常新。 自己补充了一些对该数据结构的理解,如有不对的地方,请各位指正,谢谢。 首先&…...
移动端自适应
基本实现核心思想 基本原则上是,布局更多地使用flex,然后尺寸使用rem,vw,vh为单位如果是根据不同的屏幕需要有不同的布局了,一般通过检测屏幕尺寸换不同的站点或者媒体查询使用css rem 以html字体太小为1rem的大小&…...
自动化运维工具-Ansible
一、Ansible概述 Ansible是一种基于python开发的自动化运维工具,它只需要在服务端安装ansible,无需在每个客户端安装客户端程序,通过ssh的方式来进行客户端服务器的管理,基于模块来实现批量数据配置、批量设备部署以及批量命令执…...
力扣:62. 不同路径
62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&…...
store内路由跳转router.push
选择action还是mutation 选择action mutation 是用来改变state的,不应该包含路由相关操作mutation是同步执行的,不应该包含异步操作,而路由是异步操作 action中进行路由跳转 因为vuex中没有this,所以不能用this.$router&#…...
ChatGPT Web Midjourney一键集成最新版
准备工具 服务器一台 推荐使用浪浪云服务器 稳定 安全 有保障 chatgpt api 推荐好用白嫖的api 项目演示 项目部署 浏览器访问casaos 添加软件原添加 https://gitee.com/langlangy_1/CasaOS-AppStore-LangLangy/raw/master/chatmjd.zip 安装此软件 等待安装 安装后再桌面设置…...
springboot mongodb分片集群事务
前置 mongodb分片集群想要使用事务,需要对应分片没有仲裁节点 代码 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.1.0.RELEASE</version></d…...
node报错——解决Error: error:0308010C:digital envelope routines::unsupported——亲测可用
今天在打包vue2项目时,遇到一个报错: 最关键的代码如下: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…...
golang系统内置函数整理
go语言中有很多系统内置的函数, 为了方便学习,对系统内置函数的函数定义 入参和返回值做如下整理,以方便学习和记忆。 Go语言系统级别的内置函数不多,但是包含的知识点可不少,是学习go语言说必须要搞明白的基础知识 …...
武汉星起航:五对一服务体系,助力创业者成功进军跨境电商市场
随着全球化的深入发展和互联网的普及,跨境电商已成为越来越多国内创业者的首选。然而,跨境电商市场的复杂性和多变性使得许多新手创业者望而却步。在这样的背景下,武汉星起航电子商务有限公司以其独特的五对一服务体系,为创业者提…...
C++常用库函数——strcmp、strchr
1、strcmp:比较两个字符串的值是否相等 例如 char a1[6] "AbDeG",*s1 a1;char a2[6] "AbdEg",* s2 a2;s1 2;s2 2;printf("%d \n", strcmp(s1, s2));return(0); s1指向a1,s2指向a2,strcmp表示比较s1和s…...
vue3怎么使用vant的IndexBar 索引栏
Vant 是一个基于 Vue 的移动端 UI 组件库,它提供了许多常见的移动端组件,包括 IndexBar 索引栏。以下是如何在 Vue 3 中使用 Vant 的 IndexBar 索引栏的步骤: 安装 Vant 如果你还没有安装 Vant,你可以使用 npm 或 yarn 来安装它…...
VMware常见问题(技巧)总结
目录 问题虚拟机中windows11如何开启vt 虚拟化?虚拟机Windows 11 中的相机使用失败问题? 待续、更新中 问题 虚拟机中windows11如何开启vt 虚拟化? 编辑设置—打对钩 选对正确镜像( 可翻看以往文章,有提到) 虚拟机Windows 11 中的相机使用失败问题? 1 . 没安装合适的驱动 …...
VS Code 保存+格式化代码
在 VSCode 中,使用 Ctrl S 快捷键直接保存并格式化代码: 打开 VSCode 的设置界面:File -> Preferences -> Settings在设置界面搜索框中输入“format on save”,勾选“Editor: Format On Save”选项,表示在保存…...
word启动缓慢之Baidu Netdisk Word Addin
word启动足足花了7秒钟,你知道我这7秒是怎么过来的吗? 原因就是我们可爱的百度网盘等APP,在我们安装客户端时,默认安装了Office加载项,不仅在菜单栏上加上了一个丑陋的字眼,也拖慢了word启动速度........ 解…...
获取波形极值与间距并显示
获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…...
视频素材哪个app好?8个视频素材库免费使用
视频内容已成为现代传播中不可或缺的一部分,具备卓越的视频素材对于提升任何媒体作品的质量和吸引力尤为关键。这里列举的一系列精挑细选的全球视频素材网站,旨在为您的商业广告、社交媒体更新或任何其他类型的视觉项目提供最佳支持。 1. 蛙学府&#x…...
002 validation自定义校验器
文章目录 pom.xmlValidatorUtil.javaIsMobileValidator.javaIsMobile.javaLoginVo.javaLoginController.java pom.xml <!-- 引入validation依赖,完成校验 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…...
SQL-Server数据库--视图
1.创建视图 create view as 子查询 子查询可以是任意发杂的select语句,但通常不允许含有order by和distinct短语 --使用T-SQL语句创建新视图view_score, 要求只显示学生的学号、姓名、课号、课程名称及成绩。 create view view_score as select from tb_stude…...
Flink 部署模式
目录 概述 部署模式 会话模式(Session Mode) 单作业模式(Per-Job Mode) 应用模式(Application Mode) 运行模式(资源管理模式) Standalone运行模式 会话模式部署 应用模式部署 Yarn运行模式 会话模式部署 单作业模式部…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
