再回首数据结构—链表
链表与数组一样同为线性数据结构,不少编程语言也自带了链表的实现,链表可以存放不同数据类型的数据;
与数组不同,数组占用内存结构必须为连续,而链表则不需要内存空间为连续的;链表由多个节点连接而成,每个节点除了存储当前节点的值外还存有指向链表中下一个节点的地址;链表也有多种结构:单链表、双向链表、循环链表等等;
单链表的数据结构如下所示:
通过上图可以看出链表的基本结构,每个节点由值与地址两部分组成,地址存储链中下一个节点的地址,由此将所有 节点串联起来;
链表的优势
相比数组不需要连续的内存空间,系统存在内存碎片也可使用链表;
如需要申请200MB大小的数组,但当前内存中没有足够大连续的内存空间,就算当前可用内存有200MB也不会申请成功;
而链表则不同,只要可用内存有200MB就可使用,不需要内存块为连续的它通过指针将节点(内存块)串联起来;
之前所说的动态数组其实只是伪动态当静态数组满时通过内部的resize创建一个新静态数组进行扩容,而链表为真动态;
1、 数组插入删除
数组为保持内存的连续性插入删除需要移动N个元素,时间复杂度为O(n)
2、 链表插入删除
链表未使用连续内存空间则也不需要移动元素,所以速度会比数组快不少;
由于链表使用的不时连续存储空间,所以不能像数组一样通过寻址公式就能访问到指定的元素,需要通过一个一个遍历每个节点才能找到对应的节点,所以数组的随机访问时间复杂度为O(1),而链表为O(n);
插入删除 O(n) O(1) 随机访问 O(1) O(n)
链表插入与删除
链表的插入与删除比数组快不少,链表并非使用连续的内存空间,不需要去维护内存连续性,就插入与删除而言双向链表又比单链表性能要好;
要在节点c后插入O节点,需要从第一个节点开始遍历链表知道找到节点c然后执行如下操作:
O.next = c.nextc.next = O
删除节点d需要找到该节点的前一个节点,找到节点c后执行如下操作:
c.next = d.nextd.next = null
由于单链表只存储下一个节点地址需要遍历链表节点才能找到前一个节点,而双向链表既存储了下一个节点地址又存储上一个节点地址,双向链表性能比单链表要好;
链表要点
1、如上面所说的插入元素在c节点后插入O节点,操作时需要注意要先执行O指向c的下一个节点,当一上来就执行c.next=O此时链表c节点后的节点就断开丢失了;
2、链表删除时需要注意要释放节点,如上示例:执行c.next=d.next后如未执行d.next=null此时d节点就未被释放掉,虽然链表中未有节点指向该节点,但该节点并未断开连接;
3、使用头节点简化插入、删除操作;
下面为使用Golang实现的链表
type Node struct {e interface{}next *Node}type LinkedList struct {head *Nodesize int}/**往链表头添加元素*/func (l *LinkedList) AddFirst(e interface{}) {l.Add(0, e)}func (l *LinkedList) Add(index int, e interface{}) error {if index < 0 || index > l.size {return errors.New("Add failed. Illegal index.")}prev := l.headfor i := 0; i < index; i++ {prev = prev.next}prev.next = &Node{e: e, next: prev.next}l.size++return nil}/**nil->3 2 1查找指定索引节点*/func (l *LinkedList) Find(index int) *Node {cur := l.head.nextfor i := 0; i < index; i++ {cur = cur.next}return cur}/**删除指定位置节点*/func (l *LinkedList) Remove(index int) error {node := l.head.nextif node != nil {if prev := l.Find(index - 1); prev != nil {node = prev.nextif node != nil {prev.next = node.nextnode.next = nil}}
}
return nil}
转载于:https://www.cnblogs.com/softlin/p/10146397.html
再回首数据结构—链表相关推荐
- 初学数据结构--链表
2019独角兽企业重金招聘Python工程师标准>>> 前言 在这一章,我将介绍另外一种非常重要的线性数据结构--链表.在之前介绍的动态数组,栈和队列这三种数据结构,底层其实依托于静 ...
- 【数据结构链表】之五单链表
一:链表基础 1.链表基础----------------摘录自百度百科 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中 ...
- 数据结构 - 链表 - 面试中常见的链表算法题
数据结构 - 链表 - 面试中常见的链表算法题 数据结构是面试中必定考查的知识点,面试者需要掌握几种经典的数据结构:线性表(数组.链表).栈与队列.树(二叉树.二叉查找树.平衡二叉树.红黑树).图. ...
- 剑指offer(C++)-JZ24:反转链表(数据结构-链表)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 给定一个单链表的头结点pHead,长度为n,反转该链表后,返回新链表的表头. 数据范 ...
- java数据结构-链表详解
文章目录 1.数据结构-链表详解 1.1单链表 1.1.1单链表节点的尾部添加 1.1.2单链表节点的自动排序添加 1.1.3单链表节点的修改 1.1.4单链表节点的删除 1.2单链表面试题 1.2. ...
- 数据结构——链表讲解(1)
作者:几冬雪来 时间:2023年3月3日 内容:数据结构链表讲解 目录 前言: 链表的概念: 1.为什么要有链表: 2.链表的运行原理: 3.链表的形态多少: 4.单链表的代码书写: 1.创建文件: ...
- C++数据结构链表的基本操作
这篇文章主要为大家介绍了C++数据结构链表基本操作的示例过程有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪 首先创建好一个节点 typedef struct node {in ...
- 设计模式之SOLID原则再回首
本科阶段学过设计模式,那时对设计模式的五大原则--SOLID原则的概念与理解还是比较模糊,此时过去了2年时间,在学习<高级软件工程>课程中老师又提到了设计模式,课程中还详细讨论了五 ...
- c语言仓库管理系统链表,仓库管理系统 C语言 C++ 数据结构 链表 课程设计
仓库管理系统 C语言 C++ 数据结构 链表 课程设计 #include #include #include #include #define MAX 64 typedef struct node{ ...
最新文章
- SpringCloud(第 002 篇)简单电影微服务类(消费方,而提供方为用户微服务)
- 一步步在SAP Cloud Platform上创建HANA实例并使用
- python画4维图_用Python 画个六维图,涨姿势了
- 微信客户端<->腾讯微信服务器<->开发者服务器
- Js 获取当前页面的高度
- 对VLAN间路由实验的总结
- 页面之间传递参数得几种方法
- android系统打印功能实现,Android实现系统打印功能
- BOOST1.54简化编译
- 使用Jmeter对API进行性能测试
- Mac电脑查看JDK文档,CHM格式文档阅读
- 01、Hive数据仓库——Hive SQL练习
- 64位Linux下安装iNode客户端
- python属于低级语言还是高级语言,【单选题】Python语言属于
A. 机器语言 B. 汇编语言 C. 高级语言 D. 科学计算语言...
- 数字化转型需要双模IT
- 人脸检测——RetinaFace
- 大学四年的总结与感受
- unreal4怎么设置游戏模式_UE4如何设置默认游戏模式和关卡_资源库
- 2022 年终奖个税计算方法,看看你被多收割了多少
- 安防工程商前期收集客户信息15种方法与详细流程