售船商
双向链表: LinkedList | ★★★ |
---|
| 升级版:堆栈+队列 |
优点:插入、删除元素效率较高, 允许插入重复值 | 缺点:访问查询效率较低 |
公告牌:双向链表:(LinkedList)
-
链表的一种,也叫双链表。
它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。
所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
操作指南
售船商:我来为您介绍一下!
-
您或许已经拥有了Array,ArrayList和List,不过它们都有一个重大的缺陷!
那就是从数组的中间位置删除或插入一个元素需要付出很大的代价
其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。
Hades:我可以这样理解吗?
-
就是说,乘坐那些船有个死规则,舱位中间不允许有空房间,一旦中间有人搬走,后面所有人必须全部向前挪动一个房间,这个动作,真是牵一发动全身!
售船商:没错,如果不想遵守这个规则,可以,您就要了解下LinkedList了。
-
LinkedList(底层是由链表实现的)是基于链表的数据结构,
很好的解决了数组删除插入效率低的问题,
且不用动态的扩充数组的长度。
Hades心想:
-
有这等好事?!那我愿闻其详。
售船商:没有能解决一切问题的船,选什么船要看你的实际场景。
-
List是数组链表
LinkedList是指针链表
选择List还是LinkedList要看你的使用特点.
数组链表访问快,复杂度O(1),但是添加删除复杂度O(n)
指针链表访问复杂度是O(n),但是添加删除很快O(1)
Hades:
-
你这样说我又晕了,能不能说得简单点。
售船商:这样吧,首先我来介绍一下这艘船的优点。
-
如果要插入一个元素到链表的中间位置,会非常的快,
原因是,如果插入,
只需要修改上一个元素的Next与下一个元素的Previous的引用即可。
Hades:你的意思是,
-
如果一批船员上船,每个人都已经记住了自己的前面和后面排的分别是谁。
接着,大家随意分房间,如果有新船员上了船,只需要告知另外两个队员这个新来的名字即可。
售船商:对,那么下面我来介绍一下这艘船的缺点。
-
链表只能是一个接着一个的访问,
这样就要用较长的时间来查找定位位于链表中间的元素。
换言之:我必须挨家挨户的敲门才能知道里面到底是谁。
Hades:我能这样理解吗?
-
这船安排座次很方便,因为它的规则就是,我永远只关注自己前后的两位兄弟,其他一律不管。然而,我要想知道船上都住了谁,那就很麻烦,必须敲开所有兄弟的门,对吧?
售船商:是这样的。您真是一位睿智的船长!
-
让您来销售这艘船,我想销量一定超过我了。
属性
属性 | 说明 |
---|
Count | 返回链表中的元素个数 |
First | 返回链表中的第一个节点 |
Last | 返回最后一个节点 |
方法:查找
船长:所有船员上船后,我只能看见船首和船尾的两个人,其余人都在自己的船舱内,我要通过这两个人去找到其他人。
方法 | 搜索元素 |
---|
Contains() | 搜索某元素,找到返回TRUE,否则返回FALSE |
Find() | 从链表头开始找某元素,并返回他的节点类,LinkedListNode<T> |
FindLast() | 与Find()类似,不同的是从尾部开始搜索 |
方法:添加
Add方法 | 添加元素 |
---|
AddBefore() | 在某节点的前面 |
AddAfter() | 在某节点的后面 |
AddFirst() | 在链表的头部 |
AddLast() | 在链表的尾部 |
方法:删除
Remove方法 | 删除元素 |
---|
Remove() | 删除指定的一个匹配对像 |
RemoveFirst() | 删除链表的头部元素 |
RemoveLast() | 删除链表的尾表元素 |
Clear() | 清除所有的元素 |
方法详解:动态更新
泰坦的肩膀
旋涡:LinkedList详解及源码学习
旋涡:C#中链表的用使用LinkedList
旋涡:C#LinkedList链表