接下来定义常用方法
1. 首尾添加
文章插图
2. 插入
文章插图
- Line 140:关于这个循环条件,循环到 idx – 1 ,使 cur 停在执行位置的前一个位置 。若停在操作位置,则无法设定前一个结点的 next 属性 。
文章插图
实现效果
文章插图
(二) 双向链表
文章插图
双向链表在单向的基础上增加了指向前的指针
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
“链“的构造方法及相关字段和属性不变,只是在方法的实现时,需要增加对 prev 的赋值
1. 首尾添加
文章插图
- Line 168、185:注意,应当先对原 head 的 prev 指针赋值,再修改 head 的指向 。
2. 插入
文章插图
一般地,先修改新结点的信息,再修改原结点的信息 。
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
3. 删除
文章插图
- Line 292:此处已经更新了 cur.next 的指向,所以并不是 Line 291 的语句 。
文章插图
(三) 循环链表循环,就是把尾部结点的 next 指针继续指向下,指向 head 。大同小异,本节内容在此不作演示,详细请参阅:(理论基础 —— 线性表 —— 循环链表 - 老程序员111 - 博客园 (cnblogs.com))
总结一1. 对比一下数组、集合与链表(1) 对于数组:
- 长度固定,初始化后长度不可变 。
- 在内存中的存储单元是连续分配的 。
- 可存储基本数据类型、引用数据类型 。
- 每个数组只能存储类型相同的元素 。
- 可通过下标与迭代器访问 。
- 长度(容量)可变,一般初始容量为 4,满后在现有容量基础上 *2 作为新的容量 。
- 在内存中的存储单元是随机分配的,可能连续也可能分散 。
- 可存储基本数据类型、引用数据类型 。
- 对于同一个 ArrayList 可以存储不同类型的数据;对于泛型集合,每个只能存储类型相同的数据 。
- 可通过下标与迭代器访问 。
- 长度可变,随结点数量变化而变化 。
- 在内存中的存储单元是随机分配的,可能连续也可能分散 。
- 结点可存储基本数据类型、引用数据类型 。
- 每个链表只能存储类型相同的元素 。
- 不可通过下标或迭代器访问,只能遍历访问 。
- 优点:可在 O( 1 ) 时间复杂度内完成查找 。
- 缺点:不能扩容;对于元素的插入与删除需 O( n ) 才能完成 。其中,插入的这个动作为 O( 1 ),移动元素的动作为 O( n ) 。
经验总结扩展阅读
- MPC:百万富翁问题
- Redisson源码解读-公平锁
- 重新整理 .net core 实践篇 ———— dotnet-dump [外篇]
- PGL Paddle Graph Learning 关于图计算&图学习的基础知识概览:前置知识点学习
- .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
- 关于ASP.NET Core WebSocket实现集群的思考
- .NET周报【11月第1期 2022-11-07】
- JVM学习笔记——内存模型篇