数据结构(二)----线性表(List)链式存储结构(1)
线性表List---链式存储结构
- 相关概念
- 链式存储结构/链式表
- 定义
- 链式存储特点
- 单链表
- 单链表读取
- 单链表插入
- 单链表删除
- 时间复杂度
- 单链表整表创建
- 单链表整表删除
- 顺序存储与链式存储差异
- Python代码链接
- Java代码链接
相关概念
链式存储结构/链式表
定义
数据域:存储数据元素的信息
指针域:存储直接后继位置,指针域中存储的信息叫做指针或链
结点Node:数据域+指针域
所以一般Node类设计:
//java
class Node{int data; //数据域Node next; // 指针域Node(int val){// 构造方法this.data = val;this.next = null;}
}
# python
class Node(Object){def __init__(self, val):self.data = val;self.next = None;
}
n个结点链成一个链表,即为线性表的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表
头指针:链表中第一个结点的存储位置
头结点:在单链表的第一个结点前附设一个结点(头结点数据域可以不存储任何信息,头
结点的指针域存储指向第⼀个结点的指针)
头指针 | 头结点 |
---|---|
头指针是指链表指向第⼀个结点的指针,若链表有头结点,则是指向头结点的指针 | 为了⽅便操作⽽设⽴,放在第⼀元素的结点之前,数据域⼀般⽆意义(可存放链表⻓度) |
头指针具有标识作⽤,通常⽤头指针作为链表的名字 | 有头结点后对于第⼀元素结点的插⼊和删除与其他结点⽆异) |
⽆论链表是否为空,头指针均不为空。头指针是链表的必要元素 | 头结点⾮必需 |
链式存储特点
⽤⼀组任意的存储单元存储线性表的数据元素,存储单元可以是连续的也可以是不连续的,所以数据元素可以存在内存未被占⽤的任意存储位置
单链表
注:下文中提到的length为链表长度/链表有效元素个数
单链表读取
- 声明⼀个结点p指向链表第⼀个结点,初始化i从1开始;
- 当i<length时,遍历链表,让p指针向后移动不断指向下⼀结点,i++;
- 若到链表末尾p为空,则说明第i个元素不存在;
- 否则查找成功,返回结点p的数据。
单链表插入
- 声明⼀个结点p指向链表第⼀个结点,初始化i从1开始;
- 当i<length时遍历链表,p指针向后移动不断指向下⼀个结点,i++
- 当遍历到链表尾p为空,说明第i个元素不存在
- 否则查找成功,⽣成空结点s
- 将要插⼊的结点赋值给s→data
- 单链表的标准插⼊:
s→next=p→next;
p→next=s;
(如果交换语句顺序:p→next=s;s→next=p→next; 会导致,
p→next⾸先会被覆盖成s的地址,那么s→next=s,
此时原本的p→next就没有了上级,链表造成断链) - 返回成功
单链表删除
- 声明⼀个结点p指向链表的第⼀个结点位置,初始化i从1开始
- 当i<length时遍历链表,指针p后移,i++
- 当到链表尾部p尾空,说明第i个元素不存在
- 否则查找成功,将要删除的结点赋值为q,即p→next=q
- 删除p→next = q→next(其实4、5步综合来看就是p→next=p→next→next; 只是
我们需要删除的结点data值,多了⼀个变量缓存它) - 将q结点的data值赋值给e,等待返回
- 释放q结点(一般来说c c++就要手动释放,java和python有自动回收机制)
- 返回e
时间复杂度
遍历查找第i个元素+插入/删除元素,都为O(n)
情况:当从第i个位置 插⼊10个元素
顺序表:每次都要移动n-i个元素,每次都是O(n)
单链表:只需要第⼀个找到第i个位置的指针此时为O(n),接下来都是移动指针,时间复
杂度都为O(1)
总结:插⼊或删除越频繁,单链表优势会更⼤
单链表整表创建
- 声明⼀结点p和计数器变量i;
- 初始化空链表L
头插法
(3). 让L的头结点的指针指向NULL,建⽴⼀个带头结点的单链表
(4). 循环p:
a. ⽣成新的结点赋值给p;
b. 随机⽣成数字赋值给p的数据域p→data
c. 将p插⼊到头结点与前⼀新结点之间
尾插法
(3). 新建r指向尾部结点 r=*L
(4). 循环p:
a. ⽣成新的结点p
b. 随机⽣成数字赋值给p的数据域p→data
c. 将表尾终端结点的指针指向新指针 r→next=p
d. 将当前的新结点定义成表尾终端结点 r=p
(5). 将最后链表的指针域置空,明晰尾部 r→next=NULL
单链表整表删除
- 声明结点p和q
- 将第⼀个结点赋值为p
- 循环p:
a. 将下⼀结点赋值给q
b. 释放p
c. 将q赋值p - 最后将头结点指针域置为空
q的作⽤:记录下⼀结点,以便等当前结点释放后,把下⼀结点拿回来补充
顺序存储与链式存储差异
存储分配⽅式 | 时间性能 | 空间性能 |
---|---|---|
顺序存储⽤⼀段连续的存储单元依次存储线性表的数据元素 | 查找:顺序存储O(1) 单链表O(n) | 顺序存储需预分配存储空间,分⼤了,浪费,分⼩了容易发⽣上溢 |
单链表采⽤链式存储结构,⽤⼀组任意的存储单元存放元素 | 插⼊删除:顺序存储结构需要平均移动表⻓⼀半的元素O(n)单链表找出某位置的指针后,插⼊和删除为O(1) | 单链表不需要分配存储空间,只要有就可以分配,元素个数不受限制 |
Python代码链接
本章节python相关代码链接
其中single_link_list.py 为顺序结构线性表
其他的文件可以看README.md里面有详解
Java代码链接
本章节python相关代码链接
其中SingleLinkList.java 为顺序结构线性表
其他的文件可以看README.md里面有详解
如果文章或者代码有问题,欢迎帮我指出,感激不尽,互勉~
数据结构(二)----线性表(List)链式存储结构(1)相关推荐
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 【数据结构】CH2 线性表的链式存储结构
目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 数据结构-线性表(链式存储结构)
线性表(链式存储结构) 特点: 用一组任意的存储单元存储线性表的数据结构,这组存储单元可以是连续的,也可以是不连续的. 对数据结构ai来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直 ...
- 数据结构开发(5):线性表的链式存储结构
0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...
- 线性表(链式存储结构)
前言 线性表(顺序存储结构-用数组描述) 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的, ...
- 链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...
最新文章
- PyTorch Hub发布获Yann LeCun强推!一行代码调用经典模型
- C语言程序设计之标准库快速排序qsort函数用法示例
- 回顾build 2016:你好,这是微软迄今最好的Windows开发平台
- mysql 定义XML字段_MyBatis之基于XML的属性与列名映射
- 毕业论文排版之Word 中公式居中,编号靠右该怎么设置(针对左右不对称页边距)
- java自学路线图_JAVA自学路线图
- 理解Python闭包,这应该是最好的例子
- 【测试沉思录】5. 测试人员如何快速熟悉新业务?
- BM3D算法半解,带python代码
- 使用john进行密码爆破
- Spring学习笔记-C7-SpringMVC高级技术
- win10热点 ip配置失败
- 海南大学838信号与系统专业课的感悟
- install quantopian时出现No module named pip.req的解决办法
- IntelliJ IDEA java开发环境
- Android 使用MediaPlayer播放本地raw资源超简单实现点击播放效果
- STM32_光敏、温湿度传感的选择?
- vue2.x 播放rtmp,hls,m3u8直播流教程,亲测可用
- React 入门实例教程(原作者: 阮一峰)
- RobotStudio 创建机械装置