LinkedList与链表(一)
1.为什么要学习LinkedList我们刚刚学习了ArrayList增添数据需要扩容操作浪费空间。查找数据的时间复杂度按下标索引的可以O1按内容查找的就需要ON。添加某一点的数据需要把后面的数据后移时间复杂度为ON所以ArrayList适合给定下标的查找更新在任意位置插入删除数据方面适合使用LinkedList。2.LinkedList2.1链表的概念链表是一种物理存储结构上非连续存储结构数据元素的逻辑顺序是通过链表中的引用链接。也就是说在链表中内存地址不一定连续但是逻辑上一定是连续的物理上不一定连续。注链表结构分为单向与双向循环与非循环带头和不带头组合方式很多我们主要学习带头单向不循环。2.2节点我们可以想象火车火车是由一节节车厢连接而成在链表中我们称这一节节车厢为节点。节点一共分为上下两个部分上半部分我们用来存放数据定义为val下半部分用来存放下一个节点的地址定义为next。如图所示我们知道12的内存地址是0X187定义第一个节点为head,当我们把curA.next cur,此时curA的next指针会指向curB的地址curB的next仍然是null代表后面没有节点了如下图所示2.3head在链表中head可以是头指针不是节点没有val,用来存储第一个节点的地址也可以是一个节点头节点他的val 可以是空的next指向下一个节点。2.4节点代码部分class ListNode{ int val; ListNode next; public ListNode(){} public ListNode(int val){ this.val val; } }3.链表的实现3.1ILinkedList首先我们先定义一个ILinkedList接口实现链表的方法public interface ILinkedList { //头插法 void addFirst(int data); //尾插法 void addLast(int data); //任意位置插⼊,第⼀个数据节点为0号下标 void addIndex(int index,int data); //查找是否包含关键字key是否在单链表当中 boolean contains(int key); //删除第⼀次出现关键字为key的节点 void remove(int key); //删除所有值为key的节点 void removeAllKey(int key); //得到单链表的⻓度 int size(); void clear(); void display(); }3.2MySingleList用MySingleList实现ILinkedList接口。Override public void addFirst(int data) { } Override public void addLast(int data) { } Override public void addIndex(int index, int data) { } Override public boolean contains(int key) { return false; } Override public void remove(int key) { } Override public void removeAllKey(int key) { } Override public int size() { return 0; } Override public void clear() { } Override public void display() { }我们可以在MySIngleList类里面写一个静态内部类表示节点static class ListNode{ public int val; public ListNode next; public ListNode(){} public ListNode(int val){this.val val;} }接下来定义一个链表我们将在这个链表上实现插入删除等操作(1)public ListNode head;//头节点 public void createNode(){ ListNode node1 new ListNode(12); ListNode node2 new ListNode(23); ListNode node3 new ListNode(34); ListNode node4 new ListNode(45); }此时每个节点都是单独存在的head不指向任何节点我们需要把节点连在一起形成链表并且head指向头节点。2public void createNode(){ ListNode node1 new ListNode(12); ListNode node2 new ListNode(23); ListNode node3 new ListNode(34); ListNode node4 new ListNode(45); node1.next node2; node2.next node3; node3.next node4; head node1; }链表创建好了接下来我们一步步实现ILinkedList的功能。3.3display , size和clean1display打印链表我们只需要打印每个链表的val值定义一个临时指针cur用来遍历head不能用来遍历否则我们的头节点就丢了链表就找不到起点了在让cur cur.next保证cur null。public void display() { ListNode cur head; while(cur ! null){ System.out.print(cur.val ); cur cur.next; } System.out.println(); }(2)size定义一个int变量count用来表示链表节点总数同样定义一个临时指针用来遍历直至curnull返回count值。public int size() { int count 0; ListNode cur head; while(cur ! null){ count; cur cur.next; } return count; }3clean可以直接this.head null也可以定义一个临时指针cur指向head在while循环里cur null的条件下我们可以定义一个curN cur.next这样我们先让cur null我们需要cur原来的next这时候curN的作用就体现出来了指向cur.next的地址所以我们在清除了cur的地址后可以通过cur curN继续一个一个的清除cur的每一个节点。public void clear() { ListNode cur head; while(cur ! null){ ListNode curN cur.next; cur null; cur curN; } this.head null; }3.4addFirst如果想要将data节点插入链表的最前面需要将data的next指向链表的第一个节点值12地址是0X331我们可以定义一个节点cur值为data地址为空我们让cur.next head第一个节点变成了cur。head里存放的是第一个节点的地址所以此时head必须是指向这个插入的节点即head cur 。接下来我们写代码public void addFirst(int data) { ListNode cur new ListNode(data); cur.next head; head cur; }3.5addLast我们想将一个存放data数据的节点插到链表的最后一个首先需要判断链表是否为空空的话直接将head指向插入节点如果不为空我们需要遍历链表遍历到最后一个将链表最后一个节点的next指向0X399。定义一个临时指针cur遍历列表直到最后一个节点此时cur.next null,此时while循环判断条件为cur.next ! null否则执行cur.next curN的时候会抛出空指针异常。接下来是代码部分public void addLast(int data) { ListNode curN new ListNode(data); if(head null){ head curN; return; } ListNode cur head; while(cur.next ! null){ cur cur.next; } cur.next curN; }3.6addIndex我们想在index位置插入这个节点首先我们需要判断index位置是否合法可以自定义一个异常写一个判断位置合法的方法合法的话我们需要将链表index插入节点我们需要定义一个index前一个位置的临时指针cur将cur.next指向插入的节点定义为node指向之后原来index位置原来的指针以及index后面的位置都不见了所以我们需要定义一个临时指针curN存储index位置原来的节点。接下来我们来写代码//自定义一个检查Index位置异常 public class CheckIndexException extends RuntimeException{ public CheckIndexException(){} public CheckIndexException(String msg){ super(msg); } } //MYSingleList类里面 //检查Index合法性方法 public void checkIndex(int index){ if(index 0 || index size()){ throw new CheckIndexException(index位置不合法index); } } public void addIndex(int index, int data) { checkIndex(index); if(index 0){ addFirst(data); return ; } if(index size()){ addLast(data); return; } ListNode cur head; ListNode curN head.next; ListNode node new ListNode(data); int count 0; while(count ! index - 1){ cur cur.next; curN curN.next; count; } cur.next node; node.next curN; }其中按照Index查找可以单独写一个findIndex方法这样以后按照Index查找就不用每次写一个while循环了public void addIndex(int index, int data) { checkIndex(index); if(index 0){ addFirst(data); return ; } if(index size()){ addLast(data); return; } ListNode cur findIndex(index); ListNode node new ListNode(data); /*int count 0; while(count ! index - 1){ cur cur.next; curN curN.next; count; }*/ node.next cur.next; cur.next node; } public ListNode findIndex(int index){ ListNode cur head; int count 0; while(count ! index - 1){ cur cur.next; count; } return cur; }3.7contains这个就比较简单我们只需要遍历链表查看链表是否存在数据key首先检查head是否为空空的话直接返回布尔值false不为空就进入下一步遍历找到key直接返回true找不到返回falsepublic boolean contains(int key) { if(head null){ return false; } ListNode cur head; while(cur ! null){ if(cur.val key){ return true; } cur cur.next; } return false; }3.8remove和removeAllKey(1)remove如果head为空直接return不为空使用contains返回值是true的话证明key在链表里存在我们定义两个临时指针一个指向key节点的前一个节点cur一个指向key节点curN再将cur.next curN.next就可以删掉key节点其中找到key节点可以单独写一个findKey方法。接下来就是代码部分public void remove(int key) { if(head null){ return ; } if(head.val key){ head head.next; return; } if(contains(key)){ ListNode cur findKey(key); ListNode curN cur.next; cur.next curN.next; }else{ System.out.println(没有找到你要找的key值); return; } } public ListNode findKey(int key){ ListNode cur head; while(cur.next ! null){ if(cur.next.val key){ return cur; } cur cur.next; } return null; }2removeAllKey如果key 23我们需要把链表中val 23的节点全部删除首先我们需要判断head是否为空空的话直接return不空我们进入下一步我们需要两个临时指针一个cur指向key节点的前一个节点另一个curN则表示key节点这是我们定义curN cur.next;所以while循环条件是cur.next ! null,不然cur为空时curN cur.next会显示空指针异常。接下来我们进入while循环if语言判断curN.val 是否等于key,等于的话cur.next curN.next;curN curN.next;不等于的话cur curN;curN curN.next;最后跳出while循环判断head的val是否等于key因为我们循环里判断的是curN是head.next等于我们要head head.next不等于直接结束。public void removeAllKey(int key) { if(head null){ return; } ListNode cur head; ListNode curN cur.next; while(cur.next ! null){ if(curN.val key){ cur.next curN.next; curN curN.next; }else{ cur curN; curN curN.next; } } if(head.val key){ head head.next; } }

相关新闻

AI的成长----AI应用范例

AI的成长----AI应用范例

作为国内首批使用Chat GPT 4的人之一 ,GPT刚刚震撼发布,我就在收到了消息,然后过了一个月就开始使用了。如今deepseek作为全球首个推理模型,更加深得人心。1️⃣ 锁定赛道——了解你的领域与受众2️⃣ 产品画像——深挖产品细节亮…

2026/10/18 14:26:32 阅读更多 →
用卫星地图训练无人机导航!SatNav:11.8万条长程导航任务,真机部署已验证

用卫星地图训练无人机导航!SatNav:11.8万条长程导航任务,真机部署已验证

「从室内走向城市低空」 目录 01 从卫星地图构建长程视觉语言导航任务 02 现有模型在 SatNav 上的表现 03 SwiftVLN:比较不同记忆设计的效果 04 从卫星图像训练到真实无人机飞行 05 写在最后 “沿着这条路飞,在第三个路口左转&…

2026/10/18 14:26:32 阅读更多 →
C++ QT数独游戏工程:可调试、可交作业的GUI编程实践

C++ QT数独游戏工程:可调试、可交作业的GUI编程实践

简介:这是一份面向C与Qt初学者的数独游戏课程设计实践资源,适用于高校编程语言课、图形界面开发实训或小型游戏项目实践。资源完整实现了一个具备图形化交互能力的数独游戏软件,支持空白数独初始化、数字填入、颜色状态区分(黑色初…

2026/10/18 14:25:32 阅读更多 →

最新新闻

App Inventor 2 离线版更新指南:本地部署、源码重建与版本对齐

App Inventor 2 离线版更新指南:本地部署、源码重建与版本对齐

简介:AppInventor2离线版项目源码包,面向希望突破在线版资源限制的移动应用开发者、编程初学者及教育工作者。此次更新将aia源码大小上限提升至200MB,apk打包限制同步提升至200MB,用户可独享本地电脑资源,不受服务器制…

2026/10/18 15:02:54 阅读更多 →
题解:洛谷 P10188 [USACO24FEB] Milk Exchange B

题解:洛谷 P10188 [USACO24FEB] Milk Exchange B

本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…

2026/10/18 15:02:54 阅读更多 →
PDMS二次开发实战:PML脚本批量建模与管道属性处理教程

PDMS二次开发实战:PML脚本批量建模与管道属性处理教程

简介:这份资源面向化工、石油、制药等行业的三维工厂设计从业者,以及希望基于PDMS进行功能扩展的工程师与开发者,重点讲解如何利用内置脚本语言PML实现二次开发。内容涵盖PML语法基础,包括变量与数据类型、条件与循环控制结构、函…

2026/10/18 15:02:54 阅读更多 →
从零拆解订单簿撮合系统:C++满分源码实战解析

从零拆解订单簿撮合系统:C++满分源码实战解析

简介:面向软件开发求职者的微观博易项目一面试题完整解决方案,集中呈现满分作答思路与可运行代码,适合正在准备C方向技术面试、希望了解企业项目考核标准的人群。包内共有3个文件,压缩包仅1KB:一个C源文件实现核心功能…

2026/10/18 15:02:54 阅读更多 →
大模型API Key获取全攻略:控制台手动创建与编程式密钥管理

大模型API Key获取全攻略:控制台手动创建与编程式密钥管理

在AI时代,创作无限可能:获取大模型开放平台API Key的两种方式,开发者必看!如果你最近在折腾任何跟AI沾边的项目,八成绕不开一件事:去大模型开放平台申请一把API Key。不管是给博客接一个智能问答小助手&…

2026/10/18 15:02:54 阅读更多 →
梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

梯度消失全解析:从数学原理到ReLU、BN与残差连接的实战解决路径

1. 从一个训练到一半就“躺平”的模型说起如果你亲手训练过一个稍微有点深度的神经网络,大概率见过这种让人抓狂的场景:前几个epoch损失还降得好好的,突然就卡在一个不上不下的数值,准确率死活上不去,再往后训练&#…

2026/10/18 15:01:54 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →