当前位置: 首页 > news >正文

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类解读

写在开头&#xff1a;本文用于作者学习我将官方文档中LinkedList 1.6版本中类中绝大部分API全测了一遍并打印了结果&#xff0c;日拱一卒&#xff0c;常看常新。 自己补充了一些对该数据结构的理解&#xff0c;如有不对的地方&#xff0c;请各位指正&#xff0c;谢谢。 首先&…...

移动端自适应

基本实现核心思想 基本原则上是&#xff0c;布局更多地使用flex&#xff0c;然后尺寸使用rem&#xff0c;vw&#xff0c;vh为单位如果是根据不同的屏幕需要有不同的布局了&#xff0c;一般通过检测屏幕尺寸换不同的站点或者媒体查询使用css rem 以html字体太小为1rem的大小&…...

自动化运维工具-Ansible

一、Ansible概述 Ansible是一种基于python开发的自动化运维工具&#xff0c;它只需要在服务端安装ansible&#xff0c;无需在每个客户端安装客户端程序&#xff0c;通过ssh的方式来进行客户端服务器的管理&#xff0c;基于模块来实现批量数据配置、批量设备部署以及批量命令执…...

力扣:62. 不同路径

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…...

store内路由跳转router.push

选择action还是mutation 选择action mutation 是用来改变state的&#xff0c;不应该包含路由相关操作mutation是同步执行的&#xff0c;不应该包含异步操作&#xff0c;而路由是异步操作 action中进行路由跳转 因为vuex中没有this&#xff0c;所以不能用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项目时&#xff0c;遇到一个报错&#xff1a; 最关键的代码如下&#xff1a; Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:80:19)百度后发现是node版本的问题。 在昨天我确实操作了一下node&…...

golang系统内置函数整理

go语言中有很多系统内置的函数&#xff0c; 为了方便学习&#xff0c;对系统内置函数的函数定义 入参和返回值做如下整理&#xff0c;以方便学习和记忆。 Go语言系统级别的内置函数不多&#xff0c;但是包含的知识点可不少&#xff0c;是学习go语言说必须要搞明白的基础知识 …...

武汉星起航:五对一服务体系,助力创业者成功进军跨境电商市场

随着全球化的深入发展和互联网的普及&#xff0c;跨境电商已成为越来越多国内创业者的首选。然而&#xff0c;跨境电商市场的复杂性和多变性使得许多新手创业者望而却步。在这样的背景下&#xff0c;武汉星起航电子商务有限公司以其独特的五对一服务体系&#xff0c;为创业者提…...

C++常用库函数——strcmp、strchr

1、strcmp&#xff1a;比较两个字符串的值是否相等 例如 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&#xff0c;s2指向a2&#xff0c;strcmp表示比较s1和s…...

vue3怎么使用vant的IndexBar 索引栏

Vant 是一个基于 Vue 的移动端 UI 组件库&#xff0c;它提供了许多常见的移动端组件&#xff0c;包括 IndexBar 索引栏。以下是如何在 Vue 3 中使用 Vant 的 IndexBar 索引栏的步骤&#xff1a; 安装 Vant 如果你还没有安装 Vant&#xff0c;你可以使用 npm 或 yarn 来安装它…...

VMware常见问题(技巧)总结

目录 问题虚拟机中windows11如何开启vt 虚拟化?虚拟机Windows 11 中的相机使用失败问题? 待续、更新中 问题 虚拟机中windows11如何开启vt 虚拟化? 编辑设置—打对钩 选对正确镜像( 可翻看以往文章,有提到) 虚拟机Windows 11 中的相机使用失败问题? 1 . 没安装合适的驱动 …...

VS Code 保存+格式化代码

在 VSCode 中&#xff0c;使用 Ctrl S 快捷键直接保存并格式化代码&#xff1a; 打开 VSCode 的设置界面&#xff1a;File -> Preferences -> Settings在设置界面搜索框中输入“format on save”&#xff0c;勾选“Editor: Format On Save”选项&#xff0c;表示在保存…...

word启动缓慢之Baidu Netdisk Word Addin

word启动足足花了7秒钟&#xff0c;你知道我这7秒是怎么过来的吗&#xff1f; 原因就是我们可爱的百度网盘等APP&#xff0c;在我们安装客户端时&#xff0c;默认安装了Office加载项&#xff0c;不仅在菜单栏上加上了一个丑陋的字眼&#xff0c;也拖慢了word启动速度........ 解…...

获取波形极值与间距并显示

获取并显示波形的极值与极值间距 1、流程 1、通过signal.find_peaks获取极大值 2、获取极大值下标 3、获取极大值对应的值 4、获取极大值的下标间距(就是隔多远有一个极大值) 5、获取极大值间距的标准差、方差、均值、最大值 6、图形展示波形图并标记极大值2、效果图 3、示…...

视频素材哪个app好?8个视频素材库免费使用

视频内容已成为现代传播中不可或缺的一部分&#xff0c;具备卓越的视频素材对于提升任何媒体作品的质量和吸引力尤为关键。这里列举的一系列精挑细选的全球视频素材网站&#xff0c;旨在为您的商业广告、社交媒体更新或任何其他类型的视觉项目提供最佳支持。 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语句&#xff0c;但通常不允许含有order by和distinct短语 --使用T-SQL语句创建新视图view_score, 要求只显示学生的学号、姓名、课号、课程名称及成绩。 create view view_score as select from tb_stude…...

Flink 部署模式

目录 概述 部署模式 会话模式&#xff08;Session Mode&#xff09; 单作业模式(Per-Job Mode) 应用模式(Application Mode) 运行模式&#xff08;资源管理模式&#xff09; Standalone运行模式 会话模式部署 应用模式部署 Yarn运行模式 会话模式部署 单作业模式部…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...