Python线性表——单链表

线性表简介 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。 数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种相同的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。 2. 数组 数组在实际的物理内存上也是连续存储的,数组有上界和下界。C语言中定义一个数组: 数组下标是从0开始的,a[0]对应第一个元素。其中,a[0]称为数组a的下界,a[6]称为数组a的上届。超过这个范围的下标使用数组,将造成数组越界错误。 数组的特点是:数据连续,支持快速随机访问。 数组分为固定数组与动态数组。其中固定数组的大小必须在编译时就能够确认,动态数组允许在运行时申请数组内存。复杂点的数组是多维数组,多维数组实际上也是通过一维数组来实现的。在C语言中,可以通过malloc来分配动态数组,C++使用new。另外,C++的标准模板库提供了动态数组类型vector以及内置有固定数组类型array。 Python中list可以被认为是封装好的数组。 3. 单向链表 单向链表是链表的一种。链表由节点所构成,节点内含一个指向下一个节点的指针,节点依次链接成为链表。因此,链表这种数据结构通常在物理内存上是不连续的。链表的通常含有一个头节点,头节点不存放实际的值,它含有一个指针,指向存放元素的第一个节点。 show me the code class Node(): """ 单链表中的节点应该具有两个属性:val 和 next。 val 是当前节点的值, next 是指向下一个节点的指针/引用。 """ def init__(self, value): # 存放元素数据 self.val = value # next是下一个节点的标识 self.next = None 设计链表的实现 您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。 addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。 addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。 deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。 show me the code #!/usr/bin/env python # -- coding: utf-8 -- """ @Author : Young @Email : hyc554@outlook.com @site : http://www.cnblogs.com/huang-yc/ @File : linked_list2.py @version : 1.0 @Time : 2019/4/5 11:06 Description about this file: """ class Node(): """ 单链表中的节点应该具有两个属性:val 和 next。 val 是当前节点的值, next 是指向下一个节点的指针/引用。 """ def __init__(self, value): # 存放元素数据 self.val = value # next是下一个节点的标识 self.next = None class SingleLinkList(): def __init__(self, node=None): # 头节点定义为私有变量 self._head = node def is_empty(self): # 判断链表是否为空 if self._head is None: return True else: return False def get(self, index: int) -> int: """ 获取链表中第 index 个节点的值。如果索引无效,则返回-1 :param index: 索引值 :return: """ if self._head is None: return -1 cur = self._head for i in range(index): if cur.next is None: return -1 cur = cur.next return cur.val def length(self): """ cur游标,用来移动遍历节点 count用来计数 :return: 返回链表的长度 """ cur = self._head count = 0 while cur is not None: count += 1 cur = cur.next return count def travel(self): """ 遍历整个链表 :return: """ cur = self._head while cur is not None: print(cur.elem, end=' ') cur = cur.next def add_at_head(self, val: int) -> None: """ 在头部添加一个节点 :param val: :return: None """ # 先创建一个保存item值的节点 node = Node(val) # 判断链表是否为空 if self._head is None: self._head = node else: # 将新节点的链接域next指向头节点,即_head指向的位置 node.next = self._head # 将链表的头_head指向新节点 self._head = node def add_at_tail(self, val: int) -> None or int: """ 在尾部添加一个节点 :param item: :return: """ node = Node(val) # 若链表为空,直接将该节点作为链表的第一个元素 if self._head is None: self._head = node else: cur = self._head while cur.next is not None: cur = cur.next cur.next = node def add_at_index(self, index: int, val: int) -> None: """ 在指定位置pos添加节点 pos从0开始 :param index: :param val: :return: """ # 若指定位置pos为第一个元素之前,则执行头部插入 if index <= 0: self.add_at_head(val) # 若指定位置超过链表尾部,则执行尾部插入 elif index >= self.length(): self.add_at_tail(val) # 找到指定位置 else: # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置 pre = self._head count = 0 node = Node(val) # 在目标节点的前一位停下 while count < (index - 1): count += 1 pre = pre.next # 先将新节点node的next指向插入位置的节点 node.next = pre.next # 将插入位置的前一个节点的next指向新节点 pre.next = node def delete_at_index(self, index: int) -> None or int: """ 如果索引 index 有效,则删除链表中的第 index 个节点。 :param index: 对应的索引值 :return: -1表示为异常 """ pre = None cur = self._head if index is 0: self._head = None for i in range(index): if cur.next is None: # raise IndexError("越界") return -1 pre = cur cur = pre.next else: pre.next = cur.next def search(self, val: int) -> True or False: """ 查找节点是否存在 :param val: 节点的val值 :return: """ cur = self._head while cur is not None: if cur.val == val: return True else: cur = cur.next return False if __name == '__main__': obj = SingleLinkList() obj.add_at_head(1) obj.add_at_tail(3) obj.add_at_index(1, 2) obj.travel() obj.delete_at_index(1) obj.travel() 链表与顺序表的对比 链表失去了顺序表随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大,但对存储空间的使用要相对灵活。 链表与顺序表的各种操作复杂度如下所示: 操作 链表 顺序表 访问元素 O(n) O(1) 在头部插入/删除 O(1) O(n) 在尾部插入/删除 O(n) O(1) 在中间插入/删除 O(n) O(n) 参考资料 https://www.cnblogs.com/QG-whz/p/5170147.html https://blog.csdn.net/weixin_39881922/article/details/80470896 https://leetcode-cn.com/explore/learn/card/linked-list/193/singly-linked-list/741/

python的线性链表_Python线性表——单链表-阿里云开发者社区相关推荐

  1. impdp导入表结构和表数据_EXP COMPRESS以及EXP/IMP EXPDP/IMPDP导入表结构注意-阿里云开发者社区...

    EXP COMPRESS以及EXP/IMP EXPDP/IMPDP导入表结构注意 重庆八怪 2014-09-10 987浏览量 简介: 关于EXP COMPRESS参数 一直对这个参数有些疑惑.当然此 ...

  2. python模拟登录163邮箱_python模拟登录网易邮箱-阿里云开发者社区

    python模拟登录网易邮箱 #coding:utf-8 import urllib2,urllib import cookielib from bs4 import BeautifulSoup #设 ...

  3. python基础框架_Python基础框架和工具-阿里云开发者社区

    Python基础框架和工具 最近在学Python金融大数据分析,在安装Python进行大数据分析的环境时遇到很多问题,例如:在安装pandas包时候就要到各种错误,总是缺少很多安装包,最后发现利用Py ...

  4. python函数几个return语句_Python常用函数--return 语句-阿里云开发者社区

    在Python教程中return 语句是函数中常用的一个语句. return 语句用于从函数中返回,也就是中断函数.我们也可以选择在中断函数时从函数中返回一个值. 案例(保存为 function_re ...

  5. python获取session里的_python 怎么取sessionid-问答-阿里云开发者社区-阿里云

    获取sessionid代码如下: 1 #!/usr/bin/env python 2 3 import cookielib 4 from urllib2 import Request, build_o ...

  6. python%怎么算_python怎么算log-问答-阿里云开发者社区-阿里云

    ! /usr/bin/env python -- coding: utf-8 -- """ logging配置 """ import os ...

  7. python做泰勒展开_python中的泰勒展开-问答-阿里云开发者社区-阿里云

    也许有点过头了,但这里有个不错的解决方法,用辛普森法来计算无穷级数. from sympy.abc import k from sympy import Sum, oo as inf import m ...

  8. python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区

    6 词频统计 完成分词以后,词频统计就非常简单了.我们只需要根据分词结果把片段切分开,去掉长度为一的片段(也就是单字),然后数一下每一种片段的个数就可以了. 这是出现次数排名前 20 的单词: (括号 ...

  9. python 变量类型list_Python基础变量类型——List浅析-阿里云开发者社区

    Python使用list 一.list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示 ...

  10. 测试接口python常用命令_用python实现接口测试(四、操作MySQL)-阿里云开发者社区...

    一.MySQL简介 使用Python进行MySQL的库主要有三个,Python-MySQL(更熟悉的名字可能是MySQLdb),PyMySQL和SQLAlchemy. Python-MySQL资格最老 ...

最新文章

  1. vue 如何处理两个组件异步问题_Vue动态异步组件实现思路及其问题
  2. SAP MM Vendor Rebate Process and Settings
  3. 数据库入门经典基础总结
  4. 首先请与所有现有链接到该网络共享的映射断开连接_疫情之下:该如何使用Python预测员工流失,老板直呼内行!...
  5. apolloxlua include关键字
  6. 写在2017年的总结
  7. 雷达篇(二)线性调频信号公式推导及matlab仿真
  8. 简单常用的互联网赚钱工具分享
  9. 网站微信扫码登录回调不跳转问题
  10. C# WinForm 中嵌入另一个.EXE程序(给程序加锁)
  11. vue element-plus 插件
  12. 转换优化 onnx模型
  13. 手机屏幕到底要多大才算是个头?
  14. 郸城计算机学校,郸城科技职业中等专业学校
  15. 看着很滑稽,但现实又何尝不是这样呢?
  16. 线上Java 高CPU占用、高内存占用排查思路
  17. 如何区分室外网线和室内网线?
  18. 私有化搭建个人网盘 NextCloud
  19. 关于屏幕分辨率的一点常识
  20. 当代青年善待爸妈指南

热门文章

  1. QuartusII联合modelsim仿真时调用两个模块如何设置
  2. 计算机的网络操作题,计算机网络操作题
  3. 数字电路反相器符号_数字电路の门电路(1)
  4. 关联表 会影响速度_有机硅胶怎么才会固化?固化速度受哪些因素影响?
  5. SQL server 统计分组经计
  6. 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
  7. Linux下Nginx访问web目录提示403Forbidden
  8. android 通过webview调起支付宝app支付
  9. EnumWindows 使用
  10. SharePoint2010内容类型剖析(四)