算法与数据结构(part6)--单向链表
学习笔记,仅供参考,有错必纠
参考自:单链表头指针、头结点、头元结的辨析
文章目录
- 算法与数据结构–基于python
- 链表
- 为啥需要链表
- 什么是链表
- 单向链表
- 什么是单向链表
- 单列表的操作
- 节点的实现
- 单链表的实现
- 链表与顺序表的对比
算法与数据结构–基于python
链表
为啥需要链表
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来不是很灵活;而链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
什么是链表
链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理,链表是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个结点(数据存储单元)里存放下一个结点的位置信息(即地址)。
单向链表
什么是单向链表
单向链表也叫单链表,是链表中最简单的一种形式;它的每个结点包含两个域,一个信息域(元素域)和一个链接域;这个链接指向链表中的下一个结点,而最后一个结点的链接域则指向一个空值。
- 图示
单链表也可以没有头结点,如果没有头结点的话,那么单链表就会变成这样:
- 关于头结点
头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等),首元结点也就是第一个元素的结点,它是头结点后边的第一个结点,头结点不是链表所必需的。
- 关于头指针
在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针;头指针具有标识作用,故常用头指针冠以链表的名字;无论链表是否为空,头指针均不为空,头指针是链表的必要元素。
单列表的操作
is_empty()
#链表是否为空
length()
#链表长度
travel()
#遍历整个链表
append(item)
#链表尾部添加元素
add(item)
#链表头部添加元素
insert(pos, item)
#指定位置添加元素
search(item)
#查找结点是否存在
remove(item)
#删除结点
节点的实现
class Node:def __init__(self, elem):#初始化数据区self.elem = elem#初始化链接区self.next = None
单链表的实现
首先,我们参照下图中的链表形式,来构造我们的单链表:
同时,我们参照下图中的尾插法,在我们的链表末尾插入数据:
参照下图中的头插法,在链表头部添加元素:
参照下图中的插入法,在链表中指定位置插入元素:
参照下图中的删除法,在链表中删除某个指定元素:
定义单链表:
class SingleLinkedList:def __init__(self):#头指针self.__head = None#判断链表是否为空def is_empty(self):return self.__head is None#查询长度def length(self):#判断是否为空if self.is_empty():return 0else:#定义游标cur = self.__head#计数count = 0while cur != None:cur = cur.nextcount += 1return count#遍历链表def travel(self):if self.is_empty():returnelse:#定义游标cur = self.__headwhile cur != None:#打印数据print(cur.elem, " ")cur = cur.nextprint('')#链表尾部添加元素def append(self, item):#定义新节点node = Node(item)#判断链表是否为空if self.is_empty():self.__head = nodeelse:cur = self.__headwhile cur.next!= None:cur = cur.next#while循环结束后,cur到达了最后一个节点cur.next = node#链表开头插入def add(self, item):#新节点node = Node(item)if self.is_empty():self.__head = nodeelse:node.next = self.__headself.__head = node#链表中指定位置插入def insert(self, pos, item):#新节点if pos < 0:self.add(item)elif pos > (self.length() - 1):self.append(item)else:node = Node(item)pre = self.__headcount = 0while count < (pos -1):pre = pre.nextcount += 1#下面的两行代码顺序不可变node.next = pre.nextpre.next = node#查找节点def search(self, item):if self.is_empty():return Falseelse:cur = self.__headwhile cur!= None:if cur.elem == item:return Trueelse:cur = cur.nextreturn False#删除节点def remove(self,item):if self.is_empty():returnelse:# 定义cur游标cur = self.__head# 定义pre游标pre = None# 查找所有的位置有没有要删除的,若有则删while cur != None:# 判断cur指向的数据,是否为要删的数据if cur.elem == item:# 考虑特殊情况,恰好要删的是第一个元素if cur == self.__head:# 头结点指向后一个结点self.__head = cur.nextelse:# 删除pre.next = cur.nextreturnelse:# 移动游标,先移动pre,再移动curpre = curcur = cur.next
测试:
if __name__ == "__main__":sll = SingleLinkedList()print(sll.is_empty())print(sll.length())print('-'*20)sll.travel()print('-'*20)sll.append(1)sll.add(2)sll.append(3)sll.travel()print('-'*20)print(sll.is_empty())print(sll.length())print('-'*20)sll.insert(1,'abc')sll.travel()print(sll.search(2))print('-'*20)sll.remove('abc')sll.travel()
输出:
True
0
--------------------
--------------------
2
1
3 --------------------
False
3
--------------------
2
abc
1
3 True
--------------------
2
1
3
链表与顺序表的对比
链表与顺序表各种操作的时间复杂度:
操作 | 链表 | 顺序表 |
---|---|---|
访问元素 | O(n) | O(1) |
在头部插入/删除 | O(1) | O(n) |
在尾部插入/删除 | O(n) | O(1) |
在中间插入/删除 | O(n) | O(n) |
算法与数据结构(part6)--单向链表相关推荐
- 数据结构与算法(六)- 单向链表的反转
数据结构与算法(六)- 单向链表的反转 一.头节点插入法 /*** 反转单向链表(头插法)** 1.先定义一个节点reverseHead = new HeroNode()* 2.从头到尾遍历原来的链表 ...
- 06_JavaScript数据结构与算法(六)单向链表
JavaScript 数据结构与算法(六)单向链表 认识链表 链表和数组 链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同. 数组 存储多个元素,数组(或列表)可能是最常用的 ...
- 数据结构 (二) ----- 单向链表双向链表
相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> <数据结构 (二) ----- 单向链表&双向链表> 文章目录 单链表 一. ...
- Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除(CRUD)
Java版数据结构之单向链表 CRUD Java版数据结构之单向链表 新增,有序新增的两种方式,修改和删除; 留了一个疑问; 我的代码仓库:https://github.com/zhuangbinan ...
- Java版数据结构之单向链表
Java版数据结构之单向链表 我的代码仓库:https://github.com/zhuangbinan/datastructure package club.zhuangbinan.linkedli ...
- JavaScript的数据结构与算法(三) —— 单向链表
链表 链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的.每个元素由一个存储元素本事的节点和一个指向下一个元素的引用组成.相对于传统的数组,链表的一个好处在于,添加或者删除元素 ...
- 四、数据结构与算法 (四)单向链表面试:将链表顺序倒过来
1.代码 1.将单向链表反向 /*** 反向设置链表* @param head 传入要反向的头节点*/public void reverseSetList(HeroNode head) {//判断链表 ...
- Day 62 数据结构(单向链表,单向循环链表,双向链表)
1. 单向链表的设计 例程:创建一个动态单向链表 1.定义链表结点:数据域+指针域 2.定义链表结构体:头结点指针+结点数 3.初始化链表 4.指定位置插入新数据 5.删除指定位置数据 6.获取链表长 ...
- 数据结构入门——单向链表
基本知识点 注:数据结构系列将持续更新,欢迎交流讨论- 单向链表是一种线性结构 优点:作数据的删除.插入简单:缺点:数据查找慢 组成:数据域.后继节点的一个指针域: 单向链表,后继指针指向下一个结点 ...
最新文章
- JVM运行时栈帧结构
- 64位linux安装mysql数据库吗_CentOS7 64位安装mysql教程
- outlook2016投票_投票:2016年读者选择奖和最佳采访奖
- 场论 梯度 旋度 散度
- python经典实例-python经典实例
- 如何将GridViewEX升级到UWP(Universal Windows Platform)平台
- 第八篇: UpdateProgress 控件--显示正在处理中的信息
- RedHat系统的Yum安装
- fcpx瘦身插件_FCPX有哪些特别好用的插件?
- 前端菜鸟浅谈Web前端开发技术
- 深度学习声纹识别_一种基于机器学习及深度学习的声纹降噪方法及系统与流程...
- java 龙卷风_龙卷风在大约37000个请求后停止响应
- [Maven实战-许晓斌]-[第二章]-2.3安装目录分析
- SpringBoot整合Docker实现一次构建到处运行
- Sun工作站技术文档
- 电脑哔哩哔哩播放器调整为html5,谷歌浏览器插件哔哩哔哩(Bilibili)播放器扩展Extension for Bilibili Player关闭弹幕、截图、画中画...
- 【Fusion】Conic Quadratic Optimization
- XP sp3 安装Step7 V5.5和WinCC V7.0记录(仅用于个人)
- er图转换成关系模型的例题_有关数据库系统的练习题 E-R图的关系画图转换,,急需 谢谢了...
- PXI/PXIe控制器 4Link架构 16GB带宽 兼容主流PXIe机箱 设计文件!!! 原理图PCB
热门文章
- ie8 object param没有效果_如何用php实现分页效果
- 2020年408真题_2020年408真题和参考解析
- c语言指针中冒号的用法,在c中使用冒号后面的类名
- java 用于xcopy复制_java调用copy复制子文件夹及文件到指定目录(非xcopy)
- 【Linux就该这么学 20期培训笔记 01】部署虚拟环境安装linux系统
- opencv环境搭建
- SQL基础三(例子)
- 【POI word】使用POI实现对Word的读取以及生成
- C文件操作之写入字符串到指定文件并在屏幕显示
- 【转】SVM入门(一)SVM的八股简介