文章插图
双向链表在单向的基础上增加了指向前的指针
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
“链“的构造方法及相关字段和属性不变 , 只是在方法的实现时,需要增加对 prev 的赋值
1. 首尾添加
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6421605-7.png)
文章插图
- Line 168、185:注意,应当先对原 head 的 prev 指针赋值,再修改 head 的指向 。
2. 插入
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K642Cb-8.png)
文章插图
一般地,先修改新结点的信息 , 再修改原结点的信息 。
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——
3. 删除
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K642A17-9.png)
文章插图
- Line 292:此处已经更新了 cur.next 的指向,所以并不是 Line 291 的语句 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6421348-10.jpg)
文章插图
(三) 循环链表循环,就是把尾部结点的 next 指针继续指向下,指向 head 。大同小异 , 本节内容在此不作演示,详细请参阅:(理论基础 —— 线性表 —— 循环链表 - 老程序员111 - 博客园 (cnblogs.com))
总结一1. 对比一下数组、集合与链表(1) 对于数组:
- 长度固定 , 初始化后长度不可变 。
- 在内存中的存储单元是连续分配的 。
- 可存储基本数据类型、引用数据类型 。
- 每个数组只能存储类型相同的元素 。
- 可通过下标与迭代器访问 。
- 长度(容量)可变,一般初始容量为 4,满后在现有容量基础上 *2 作为新的容量 。
- 在内存中的存储单元是随机分配的,可能连续也可能分散 。
- 可存储基本数据类型、引用数据类型 。
- 对于同一个 ArrayList 可以存储不同类型的数据;对于泛型集合,每个只能存储类型相同的数据 。
- 可通过下标与迭代器访问 。
- 长度可变,随结点数量变化而变化 。
- 在内存中的存储单元是随机分配的,可能连续也可能分散 。
- 结点可存储基本数据类型、引用数据类型 。
- 每个链表只能存储类型相同的元素 。
- 不可通过下标或迭代器访问 , 只能遍历访问 。
- 优点:可在 O( 1 ) 时间复杂度内完成查找 。
- 缺点:不能扩容;对于元素的插入与删除需 O( n ) 才能完成 。其中,插入的这个动作为 O( 1 ),移动元素的动作为 O( n ) 。
- 优点:长度可变;内存易分配;可在O( 1 )内完成查找 。(一般地,集合底层结构为数组或链表)
- 缺点:因为底层与数组、链表相同 , 因此对于插入与删除较慢 。
- 优点:可以任意加减元素,在添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加、删除很快 , O( 1 );
- 缺点:因为含有大量的指针域 , 占用空间较大;不支持下标与迭代器访问,因此查找元素需要遍历,非常耗时 。
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL2ltZzIwMjIuY25ibG9ncy5jb20vYmxvZy8yODUxNTQwLzIwMjIxMS8yODUxNTQwLTIwMjIxMTA4MTM0MjQ3MjE2LTc2MzA3MzkxMC5wbmc=.jpg)
文章插图
C# 中的LinkedList 为双向链表(双重链接链表),位于程序集 System.Collections.dll中的命名空间 System.Collections.Generic 之下 。
简单解释一下其拥有的特性:【注:特性基本介绍请参阅本人的文章([算法2-数组与字符串的查找与匹配] (.NET源码学习) - PaperHammer - 博客园 (cnblogs.com))】
- Line 9:NullableContext() 表示可空的上下文 。括号中的值对应的功能如下图:
![.NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>](http://img.zhejianglong.com/231019/1K6422M3-12.jpg)
文章插图
这里解释一下“上下文”:
上下文并不是一个具体的东西,就和阅读小说一样,需要结合前后进行理解 。
推荐阅读
- 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学习笔记——内存模型篇