Python数据结构与算法(第三天)
18.链表的提出
根据线性表的实际存储方式,分为两种实现模型:
顺序表,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。
链表,将元素存放在通过链接构造起来的一系列存储块中。
为什么需要链表
顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。
链表的定义
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
19.单链表的ADT模型
单向链表
单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。
- 表元素域elem用来存放具体的数据。
- 链接域next用来存放下一个节点的位置(python中的标识)
- 变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。
单链表的操作
- is_empty() 链表是否为空
- length() 链表长度
- travel() 遍历整个链表
- add(item) 链表头部添加元素
- append(item) 链表尾部添加元素
- insert(pos,item) 指定位置添加元素
- remove(item) 删除节点
- search(item) 查找节点是否存在
20.Python中变量标识的本质
a=10
b=20
a,b=b,a
a指向10的地址,b指向20的地址
a,b=b,a先从右边开始
a,b=20,10
21.单链表及结点的定义代码
节点实现
class SingleNode(object):"""单链表的结点"""def __init__(self,item):# _item存放数据元素self.item = item# _next是下一个节点的标识self.next = None
单链表的实现
class SingleLinkList(object):"""单链表"""def __init__(self):self._head = None #私有属性
22.单链表的判空、长度、遍历与尾部添加结点的代码实现
单链表的实现
class SingleLinkList(object):"""单链表"""def __init__(self):self._head = Nonedef is_empty(self):"""判断链表是否为空"""return self._head == Nonedef length(self):"""链表长度"""# cur初始时指向头节点cur = self._headcount = 0# 尾节点指向None,当未到达尾部时while cur != None:count += 1# 将cur后移一个节点cur = cur.nextreturn countdef travel(self):"""遍历链表"""cur = self._headwhile cur != None:print cur.item,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# 将尾节点指向nodecur.next = node# 将node指向头节点_headnode.next = self._head
23.单链表尾部添加和在指定位置添加
def add(self, item):"""头部添加节点"""node = Node(item)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)cur = self._headcount = 0# 移动到指定位置的前一个位置while count < (pos-1):count += 1cur = cur.nextnode.next = cur.nextcur.next = node
24.单链表查找和删除元素
def search(self, item):"""查找节点是否存在"""if self.is_empty():return Falsecur = self._headif cur.item == item:return True while cur != None:cur = cur.nextif cur.item == item:return Truereturn False
def remove(self,item):cur = self.__headpre=Nonewhile cur != None:if cur.elem == item:if cur == self.__head:self.__head = cur.nextelse:pre.next = cur.nextbreakelse:pre = curcur = cur.next
25.单链表与顺序表的对比
链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。
操作 | 链表 | 顺序表 |
---|---|---|
访问元素 | O(n) | O(1) |
在头部插入/删除 | O(1) | O(n) |
在尾部插入/删除 | O(n) | O(1) |
在中间插入/删除 | O(n) | O(n) |
注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。
Python数据结构与算法(第三天)相关推荐
- 【Python数据结构与算法】(三):递归(Recursion)
[Python数据结构与算法](三):递归(Recursion) ✨本文收录于<Python数据结构与算法>专栏,此专栏主要记录如何python学习数据结构与算法笔记.
- python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
for (刚入门的编程)的高中 or 大学生 leetcode 介绍 leetcode 可以说是 cs 最核心的一门"课程"了,虽然不是大学开设的,但基本上每一个现代的高水平的程序 ...
- Python数据结构与算法(一)列表和元组
本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...
- Python数据结构与算法(4.1)——递归
Python数据结构与算法(4.1)--递归 0. 学习目标 1 递归 1.1 递归的基本概念 1.2 递归的重要性 1.3 递归三原则 1.4 递归的应用 2 递归示例 2.1 列表求和 2.2 汉 ...
- Python数据结构与算法(1.1)——数据结构与算法导论
Python数据结构与算法(1.1)--数据结构与算法导论 0. 学习目标 1. 数据结构概述 1.1 什么是数据结构 1.2 逻辑结构和物理结构 1.3 抽象数据类型 1.4 数据结构学习的必要性 ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- Python天天美味(32) - python数据结构与算法之堆排序
1. 选择排序 选择排序原理是先选出最小的数,与第一个数交换,然后从第二个数开始再选择最小的数与第二个数交换,-- def selection_sort(data): for i in ran ...
- python数据结构与算法13_python 数据结构与算法 (13)
python 数据结构与算法 (13) 选择排序 (Selection sort) 是? 种简单直观的排序算法. 它的? 作原理如 下.? 先在未排序序列中找到最?(?)元素, 存放到排序序列的起始位 ...
- Python数据结构与算法(二)栈和队列
本系列总结了python常用的数据结构和算法,以及一些编程实现. 参考书籍:<数据结构与算法 Python语言实现> [美]Michael T.Goodrich, Roberto Tama ...
- Python 数据结构与算法——快排
Python 数据结构与算法--选取算法(TopK) 如果说快速选取法所代表的是剪枝式的遍历操作--在递归树中找出一条通往第 k<script type="math/tex" ...
最新文章
- react滑动切换tab动画效果_Swiper - 免费开源、功能强大的触摸滑动js特效插件
- 判断file空_File类的基本用法
- 计算机网络笔记整理图片,计算机网络高分笔记整理(2)
- 【异常】Caused by: java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Around
- 高级计算机网络知识点复习
- python打印log重复问题
- 《TCP/IP详解:卷1》之TCP/UDP总结
- 【数论】Crash的数字表格 / JZPTAB(P1829)
- Operating System-Thread(5)弹出式线程使单线程代码多线程化会产生那些有关问题
- 如何初始化局部变量c语言_【C语言更新】C语言中如何来定义一个指针,并且对其进行初始化...
- 综合素质计算机考点,教师资格证小学综合素质考点及考试真题:信息处理能力...
- AS运行软件超时解决方法
- 分析varnish日志
- Tricks(三十四)—— 判断某一属性列是数值型还是标称型
- FileStream构造函数
- JavaScript需要记的阿斯克码
- 交接文档怎么写_怎么写一篇实用的需求说明文档
- 2021科技圈十大事件盘点
- Export file created by EXPORT:V10.01.00 via conventional path
- 关于POE的知识都在这里了
热门文章
- python import_Python Import 详解
- mysql主程序目录_MySQL™ 参考手册(目录)
- vscode 运行html服务器运行_如何在vscode中调用浏览器运行html?
- c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析
- 正版七日杀服务器存档,七日杀网吧怎么存档 七日杀网吧存档读档方法介绍-游侠网...
- python中x,y=y,x的交换原理
- 从pymongo 提取最近100条数据
- dao接口有什么好处_Java后端精选技术:我们为什么要使用AOP?
- 开启大数据时代谷歌三篇论文-BigTable
- 《数据中台实战》:如何通过标签平台圈出产品高价值用户?