文章目录1.List 引入1.什么是 List2.ArrayList 的理解2.1 什么是 ArrayList2.2 ArrayList 的模拟实现2.2.1 实现 MyArrayList 类2.3ArrayList 的局限性3.链表 与 LinkedList3.1 链表的概念3.2 链表的模拟实现3.2.1 自创 MySingleList 类3.3 单链表相关的 OJ 面试题3.4 LinkedList 的结构3.5 LinkedList 的模拟实现3.5.1 实现 MyLinkedList 类3.6ArrayList、链表、LinkedList 关系1.List 引入1.什么是 List图片来自于菜鸟教程在了解ArrayList即顺序表 (Sequential List) 与LinkedList即 双向链表 (Doubly Linked List) 之前有必要先明List是什么。List是一个接口其继承自Collection类似可以理解为“合同”。它规定了所有子类需要具备的功能索引访问get(i)、插入元素add、删除元素remove等功能。List 与 ArrayList、LinkedList 的关系List 首先是一个接口可理解为合同而ArrayList、LinkedList则是它的实现类可理解为员工在合同下工作。也就是说ArrayList、LinkedList两个类都需要重写List中的方法。2.ArrayList 的理解2.1 什么是 ArrayList先从图片上引入对ArrayList的概念其实就是数组ArrayList中文称为顺序表从物理意义上它是用一段连续的物理内存数组来表达线性关系的。从源码上看主要是这几个常量包括容量数组实际大小usedSize…2.2 ArrayList 的模拟实现2.2.1 实现 MyArrayList 类我们尝试模拟实现一下ArrayList的主要功能定义一个MyArrayList类具体代码可访问GitHub远程仓库首先创建一个模拟IList接口根据接口定义的方法以及ArrayList的源码去模拟实现MyArrayList类publicinterfaceIList{// 新增元素,默认在数组最后新增publicvoidadd(intdata);// 在 pos 位置新增元素publicvoidadd(intpos,intdata);// 判断数组是否已满publicbooleanisFull();// 判定是否包含某个元素publicbooleancontains(inttoFind);// 查找某个元素对应的位置publicintindexOf(inttoFind);// 获取 pos 位置的元素publicintget(intpos);// 给 pos 位置的元素设为 valuepublicvoidset(intpos,intvalue);//删除第一次出现的关键字keypublicvoidremove(inttoRemove);// 获取顺序表长度publicintsize();// 清空顺序表publicvoidclear();// 打印顺序表注意该方法并不是顺序表中的方法为了方便看测试结果给出的publicvoiddisplay();}MyArrayList类有以下变量及构造方法publicclassMyArrayListimplementsIList{publicint[]array;publicintusedSize;publicstaticfinalintDEFAULT_CAPACITY10;publicMyArrayList(){arraynewint[DEFAULT_CAPACITY];}}由于ArrayList官方源码是适配多种类型而使用泛型我们为方便理解就从整型去创建。其涉及的相关题目可以有 杨辉三角的实现简单的洗牌算法参考源码了解完之后就对ArrayList有初步理解了2.3ArrayList 的局限性由于ArrayList底层代码是一段连续空间当在ArrayList任意位置插入或者删除元素时就需要将后续元素整体往前或者往后搬移时间复杂度为O(n)效率较低。3.链表 与 LinkedList3.1 链表的概念链表是物理存储结构上非连存储结构数据元素的逻辑顺序是通过链表中的引用链接次序实现的。每个节点存储了当前节点的value以及对下一个节点的索引其结构类似图中内容实际中链表结构又是多样的单项或者双向带头或者不带头循环或者非循环无头单向非循环链表结构简单一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。因此我们以单向无头非循环链表举例。3.2 链表的模拟实现3.2.1 自创 MySingleList 类实现的代码可访问该链接 - 参考源码我们同样可以实现上面的 IList 接口其变量、内部类以及构造方法有以下publicclassMySingleListimplementsIList{// 创建整个链表中的各个节点车厢staticclassListNode{publicintval;publicListNodenext;// 对下一个节点的索引// 初始化各个节点publicListNode(intval){this.valval;}}// 存储头节点引用火车头publicListNodehead;}主要方法有头插法addFirst()、尾插法addLast()、任意位置插入addIndex()、是否包含contains()、删除节点remove()等等我们选部分了解头插法publicvoidaddFirst(intdata){ListNodenodenewListNode(data);node.nextthis.head;this.headnode;}即在头节点前插入时间复杂度为O(1)而 ArrayList 中为O(n)尾插法publicvoidaddLast(intdata){ListNodenodenewListNode(data);if(this.headnull){this.headnode;return;}ListNodecurthis.head;// cur.next ! null可以走到倒数第二个节点// 但最后一个节点地址可获取while(cur.next!null){curcur.next;}cur.nextnode;}即在最后节点插入注意最后节点的next必须置空另外补充官方在链表中增加新节点是默认使用尾插删除节点Overridepublicvoidremove(intkey){if(this.headnull){return;}if(this.head.valkey){this.headthis.head.next;return;}// 创建当前节点curListNodecurFindNodeBeforeKey(key);cur.nextcur.next.next;}// 查找到删除节点前的一个节点privateListNodeFindNodeBeforeKey(intkey){// 创建当前节点ListNodecurthis.head;// cur要每一个都走一遍while(cur.next!null){if(cur.next.valkey){returncur;}curcur.next;}returnnull;}利用删除节点的前一节点访问到删除节点的val值去匹配key以及当前节点cur的next索引的修改3.3 单链表相关的 OJ 面试题删除链表中等于给定值 val 的所有节点。Leecode 移除链表元素反转一个单链表。Leecode 反转一个单链表给定一个带有头结点 head 的非空单链表返回链表的中间结点。如果有两个中间结点则返回第二个中间结点。Leecode 链表的中间节点输入一个链表输出该链表中倒数第k个结点。 Leecode 返回倒数第k个节点将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。Leecode 合并两个有序链表编写代码以给定值x为基准将链表分割成两部分所有小于x的结点排在大于或等于x的结点之前 。Leecode 分割链表链表的回文结构。Leecode 回文链表输入两个链表找出它们的第一个公共结点。Leecode 相交链表9.给定一个链表判断链表中是否有环。Leecode 环形链表尝试上面的 Oj 题后相信你对链表有自己的见解了以上 Oj 题我会同步发出题解文章3.4 LinkedList 的结构LinkedList的底层是双向链表结构由于链表没有将元素存储在连续的空间中元素存储在单独的节点中然后通过引用将节点连接起来了因此在任意位置插入或者删除元素时不需要搬移元素效率比较高。以下图片即为双向链表结构包含了val、prev前驱、next后驱以及head头指针和尾指针通过以下集合框架可以发现LinkedList也同样实现了 List 接口说明1.LinkedList 实现了 List 接口2.LinkedList 的底层使用了双向链表3.LinkedList 没有实现 RandomAccess 接口因此 LinkedList 不支持随机访问4.LinkedList 的任意位置插入和删除时效率比较高时间复杂度为 O(1)5.LinkedList 比较适合任意位置插入的场景3.5 LinkedList 的模拟实现3.5.1 实现 MyLinkedList 类和ArrayList、单向链表一样同样实现List接口在此我们就模拟实现IList接口publicclassMyLinkedListimplementsIList{// 内部类-各个节点classListNode{publicintval;publicListNodeprev;// 前驱publicListNodenext;// 后驱publicListNode(intval){this.valval;}}publicListNodehead;publicListNodelast;}与链表类似但删除时不再需要提前一个节点我们可直接到要删除的节点位置remove()- 删除方法Overridepublicvoidremove(intkey){ListNodecurhead;while(cur!null){if(cur.valkey){//删除在开头if(curhead){headhead.next;if(head!null){// 情况 A: 至少还有两个节点现在的 head 指向原第二个节点head.prevnull;}else{// 情况 B: 原本只有一个节点删完后 head 为 null// 必须同步清理 lastlastnull;}}else{//删除在其他中间、结尾cur.prev.nextcur.next;if(cur.nextnull){lastlast.prev;// 该情况为删除在结尾}else{cur.next.prevcur.prev;}}return;}curcur.next;}}如代码中注释删除位置首先分为两处–开头、2. 中间和结尾随后依次在分类讨论情况其常用方法与ArrayList类似3.6ArrayList、链表、LinkedList 关系线性表 (Linear List)——“我们要排成一队”(逻辑协议)├──顺序表 (Sequential List)——“大家必须坐连排座”(底层是数组)└──链表 (Linked List)——“大家随便坐手拉手就行”(底层是节点)├──单向链表——“只知道后面是谁”└──双向链表——“既知道前面也知道后面”概念名称属于什么物理结构在 Java 中的“肉身”顺序表线性表的一种实现连续数组ArrayList链表线性表的一种实现分散节点指针LinkedList链表节点链表的组成零件包含数据和指针的对象ListNode类以上是我关于Java的笔记分享感谢你读到这里这也是我学习路上的一个小小记录。希望以后回头看时能看到自己的成长~
企业数字化 ERP 产品动态
相关推荐
anylabeling 中 sam-vit-l-quant 量化模型实战:显存优化与标注提速指南 简介:这份资源是面向 AnyLabeling 标注工具用户的 Segment Anything(ViT-L Quant)量化模型包,主要解决在本地进行自动标注时缺少可用 SAM 权重的问题,适合已安装 AnyLabeling、希望借助 AI 辅助完成图像分割与标注的开… · 2026/9/27 23:46:13
基于深度学习的司机危险驾驶行为识别告警系统实战 简介:基于深度学习的司机危险驾驶行为识别告警系统,是一套面向计算机专业毕业设计的高分项目,评审得分达到九十八分,适合正在准备毕业设计的学生以及需要项目实战练习的学习者,也可用于课程设计或期末大作业。资源共包… · 2026/9/27 23:46:07
eSight SPC300补丁包Windows升级实战:校验、安装与排障指南 简介:华为eSight V300R007C00SPC300-Win是面向Windows Server 2008 R2平台的统一网络管理软件,适合需要集中运维企业网络设备的管理人员与技术团队,可对服务器、存储、交换机、路由器等异构IT基础设施实施统一监控。包内共1888个文件… · 2026/9/27 23:46:07
3步搞定wordpress中文博客模板下载,告别等待的完整流程 3步搞定wordpress中文博客模板下载,告别等待的完整流程 改个需求建站公司拖一周,这种憋屈感谁懂?我做过10年建站,见过太多老板花几万块定制,结果改个颜色都要排队。其实想要个漂亮的中文博客,根本不用找外包。WordPress中文博客模… · 2026/9/28 0:18:10
2026最新网站查询访问域名避坑指南 2026最新网站查询访问域名避坑指南 备案流程一头雾水?别慌。很多新手刚接手网站项目,对着工信部备案系统发呆,分不清域名解析、服务器绑定和访问验证的区别,更不知道2026最新政策对“网站查询访问域名”有哪些硬性要求。… · 2026/9/28 0:17:58
娱乐彩票网站建设制作避坑指南:模板vs定制实战对比 娱乐彩票网站建设制作避坑指南:模板vs定制实战对比 别信那些“一键生成”的鬼话。上周一个客户拿着某知名模板站找我改,首页加载慢了8秒,后台数据全乱,看着就廉价。做娱乐彩票这类高敏感、高并发站点, 模板网站太丑不够用… · 2026/9/28 0:17:46
拒绝拖稿!《奖励自己的网站》性能优化报价单揭秘 拒绝拖稿!《奖励自己的网站》性能优化报价单揭秘 改个需求建站公司拖一周,这大概是无数甲方和开发者最崩溃的瞬间。你只是想把首页那张图换个颜色,或者加个“立即购买”按钮,结果对方让你等,一等就是7天。等你急了去催,得到的回复往往是“测试环境还在… · 2026/9/28 0:17:33
网站管理建设的总结:源码下载后如何搞定服务器与证书 网站管理建设的总结:源码下载后如何搞定服务器与证书 域名服务器搞不懂,是不是让你建站时心里没底?很多新手拿到【源码下载】包,解压后一脸茫然:这代码往哪放?服务器怎么连?HTTPS证书怎么搞?别慌,这就是典型的“有代码无环境”困境。… · 2026/9/28 0:17:33
做网站动图的软件怎么选?避开高价坑,新手看这篇就够 做网站动图的软件怎么选?避开高价坑,新手看这篇就够 找建站公司最让人头疼的,就是报价单上一堆看不懂的名词,动不动就几万块,生怕被坑高价。很多河北转行做网站的新手,刚入行就被客户问倒:做个动图到底用什么软件?这钱该花多少?别急,咱们把【做网站… · 2026/9/28 0:16:57
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25