链表

单向链表

p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址。

表元素域elem用来存放具体的数据

链接域next用来存放下一个节点的位置(python中的标识)

变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点

节点实现

C中*代表指向地址,但Python中没有表示地址的符号/运算,那么,如何实现链表结构呢?

首先,来看一下:

a = 10 b = 20 a,b = b,a

上面实现a,b值的互换的本质是:

a = 10, 实际上是创建了 a 和 10 两个块, 地址a指向10

b = 20, 同上,等号的含义其实就包含了地址操作的意思,如下图

执行a,b = b,a 时, 先执行右边, 执行后为 a,b = 20,10

按照1、2步骤中所说的等号的含义,这个时候 a指向20 , b 指向10 ,完成了数据交换

同理,如果是:

def f(): pass a=f

这样也是可以的,如下图:

所以在Python中实现时,没有一个特殊的类型叫做地址,使用下一个链接的时候,就专门用个属性,它等于谁,就预示着它的区域指向了哪个节点

然后,来实现:

首先,要把节点定义一下,节点包含ele(元素)和next(下一个元素的地址 )

定义一个节点的类(通用写法,不使用元组/列表):

class Node(object): """节点""" def _init_(self,elem): self.elem = elem

self.next = None pass pass #在使用时,又一个节点,就去构造一个node node = Node(100) #节点构造的时候,就保存100(元素值) node2 = Node() class SingleLinkList(object): """单链表""" def _init_(self,node = None): #设置node = None这个默认参数是为了让用户在不传node的时候可以构造空链表 self.__head = node # __表示私有属性。 这个构造函数表示我之前定义好了一个node后,我可以把node 传进来, 作为这个链表的头节点 #使用: node = Node(100) # SingleLinkList(node) def is_empty(self): #面对对象的方法 """链表是否为空""" pass def length(self): """链表长度""" pass def travel(self): """遍历整个链表""" pass def add(self,item): #item 指节点 """链表头部添加元素""" pass def insert(self,pos,item): #item 指节点 """指定位置添加元素""" pass def remove(self,item): #item 指节点 """删除节点""" pass def search(self,item): #item 指节点 """查找节点是否存在""" pass #使用时,先创建对象,思考:链表的构造函数写什么? 因为头节点需要指向第一个节点,不然构不成链表,所以 SingleLinkList()的构造函数中应该定义一下头节点指向第一个节点,并且,这是针对对象的定义,而不是针对属性的,定义见上面代码。 single_obj = SingleLinkList() #SingleLinkList相当于一种新的数据结构类型 single_obj.search

之后,来看具体这些方法如何实现:

针对上面的程序

理解上面两个类之间的关系后,便很好写函数了:

class SingleLinkList(object): """单链表""" def _init_(self,node = None): self.__head = node def is_empty(self): """链表是否为空""" return self.__head == None # return true or false def length(self): #链表长度即节点数目,理解分析见**附图一** """链表长度""" #cur 游标,用来遍历节点 理解见**附图二** cur = self.__head #count 记录数量 count = 0 whlie cur != None: count += 1 cur = cur.next return count def travel(self): """遍历整个链表""" cur = self._head

whlie cur != None: print(cur.elem) cur = cur.next def add(self,item): #理解见**附图三、四** 先改变新节点,不然会打破链表结构 """链表头部添加元素""" node = Node(item) node.next = self.__head

self.__head = node def append(self,item): """链表尾部添加元素""" node = Node(item) #先定义好要插入的节点,这里的item是数值 if self.__head == None: self.__head == node else: cur = self._head while cur.next != None: cur = cur.next cur.next = node def insert(self,pos,item): #理解见**附图四、五**, pre为了方便理解,因为要在下一个位置之前才方便操作 """指定位置添加元素""" if pos <= 0: self.add(item) elif pos > (self.length()-1): self.append(item) else: pre = self.__head

count =0 while count < (pos-1): count += 1 pre = pre.next node = Node(item) node.next = pre.next pre.next = node def remove(self,item): #略 """删除节点""" pass def search(self,item): #略 """查找节点是否存在""" pass if _name_ == "_main_": ll = SingleLinkList() print(ll.isempty())

附图1 用于理解length函数

附图2

附图3 add之前

附图4 add之后的效果

附图5 insert之前的效果

附图6 insert之后的效果

对比单链表和顺序表

操作

链表

顺序表

访问元素

O(n)

O(1)

在头部插入/删除

O(1)

O(n)

在尾部插入/删除

O(n)

O(1)

在中间插入/删除

O(n)

O(n)

注意虽然表面看起来复杂度都是 O(n),但是链表和顺序表在插入和删除时进行的是完全不同的操作。链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)。顺序表查找很快,主要耗时的操作是拷贝覆盖。因为除了目标元素在尾部的特殊情况,顺序表进行插入和删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。

链表在存数据时,可以是分散的数据区域,不需要一块连续的数据区域,可以更好地利用计算机资源,通过链接起来,但是因为还要储存地址,耗的空间也更多

顺序表在存、取元素的时候可以O(1),但缺点在于,要求的存储空间连续,当要保存的数据量很大时,没有那么多连续的存储空间,那么就不能用顺序表

本文地址:https://blog.csdn.net/Yulu_Gan/article/details/109038851

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)相关推荐

  1. python如何调用文件进行换位加密_python 换位密码算法的实例详解

    python 换位密码算法的实例详解 一前言: 换位密码基本原理:先把明文按照固定长度进行分组,然后对每一组的字符进行换位操作,从而实现加密.例如,字符串"Error should neve ...

  2. python列表是顺序表还是链表_顺序表与链表

    Python中的顺序表 Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质. tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作 ...

  3. java实现爬山算法_python实现爬山算法的思路详解

    问题 找图中函数在区间[5,8]的最大值 重点思路 爬山算法会收敛到局部最优,解决办法是初始值在定义域上随机取乱数100次,总不可能100次都那么倒霉. 实现 import numpy as np i ...

  4. python顺序表的实现_数据结构:队列 链表,顺序表和循环顺序表实现(python版)...

    链表实现队列: 尾部 添加数据,效率为0(1) 头部 元素的删除和查看,效率也为0(1) 顺序表实现队列: 头部 添加数据,效率为0(n) 尾部 元素的删除和查看,效率也为0(1) 循环顺序表实现队列 ...

  5. python数据结构之链表_Python数据结构之翻转链表

    翻转一个链表 样例:给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 一种比较简单的方法是用"摘除法".就是 ...

  6. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  7. 数据结构 严薇敏 顺序表的实现(增 删 改)及其使用方法详解

    时间复杂度 数据结构 时间复杂度和空间复杂度 目录 1.线性表 2.顺序表 2.1概念及结构 2.2 接口实现 SeqList.h SeqList.c 2.2.1初始化链表以及销毁链表的实现 初始化顺 ...

  8. 顺序表的直接插入排序-----数据结构与算法笔记

    1.排序 参考书:<数据结构(C语言)>–严蔚敏等编著,清华大学出版社. 2.各种内部排序方法的比较图 所谓的排序,就是将一组无序关键字或者乱序关键字按照从大到小或者从小到大或者某种规律进 ...

  9. python的sort方法是哪种_python中的sort方法使用详解

    Python中的sort()方法用于数组排序,本文以实例形式对此加以详细说明: 一.基本形式列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可 ...

最新文章

  1. 是否注意过 isEmpty 和 isBlank 区别?
  2. Java常用消息队列原理介绍及性能对比
  3. 中国非动物胶市场来产销需求及发展潜力研究报告2022版
  4. WebSocket——[Error during WebSocket handshake: Unexpected response code: 403]解决方案
  5. ipad分屏_iPad如何分屏及常见问题
  6. RPC调用和HTTP调用的区别你知道吗
  7. javascript中的命名规则和方法
  8. 异构计算黄金时代下,超强异构计算服务器FP5468G2将会带来哪些变革?
  9. thinkphp5 定时任务
  10. c# msi中加入驱动_MSI微星:给你的CPU装上热交换气缸活塞,不用电也能驱动风扇降温...
  11. IDEA如何添加项目启动参数
  12. linux动态库路径生效,Linux下如何解决动态库的链接问题
  13. 【论文学习】Large-scale Video Classification with Convolutional Neural Networks
  14. php解析识别二维码内容
  15. HDMI是什么设备与计算机连接的接口类型,Type-C、HDMI及DP视频接口有什么区别?电脑显示器连接线如何选?...
  16. 中国护照可以免签的10个旅游天堂国家(地区)
  17. vue error The code generator has deoptimised the styling exceeds the max of 100KB
  18. 十款磁盘碎片整理工具
  19. 如何用chrome浏览器 开发插件 自动答题 自动抢票 自动选课
  20. CSS3权威指南读书笔记

热门文章

  1. 对象序列化Java中的序列化
  2. jenkins乱码解决问题
  3. 解决xml中mybatis等的dtd提示问题
  4. 2021职场白领健康图鉴.pdf(附下载链接)
  5. 【报告分享】数实共生:未来经济白皮书2021-腾讯研究院.pdf(附下载链接)
  6. leetcode力扣49. 字母异位词分组
  7. 站在BERT肩膀上的NLP新秀们(PART I)
  8. java swing 图片切换_在一个界面中要实现图片切换,用java要肿么实现??
  9. 老电脑linux内核,如何删除废旧的Linux内核(kernel)
  10. pip 安装包时出现的连接超时、host不信任问题解决方案