单链表实现(python)

来自b站视频

定义

链表是一种线性表,但不想顺序表一样连续存储数据,而是在每一个节点里存放下一个节点的位置信息。

具体代码实现

class Node():def __init__(self, elem):self.elem = elemself.next = Noneclass SingleLinkList():def __init__(self, node=None):self.__head = nodedef is_empty(self):'''判断链表是否为空'''return self.__head == Nonedef length(self):'''计算链表的长度'''cur = self.__headcount = 0while cur != None:count += 1cur = cur.nextreturn countdef travel(self):'''遍历所有的链表'''cur = self.__headwhile cur != None:print(cur.elem, end=' ')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.nextcur.next = nodedef add(self, item):'''在头部添加节点'''node = Node(item)node.next = self.__headself.__head = nodedef insert(self, pos, item):'''在指定位置pos添加节点pram:pos从0开始'''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:count += 1pre = pre.nextnode.next = pre.nextpre.next = nodedef remove(self, item):'''删除指定节点'''cur = self.__headpre = Nonewhile cur != None:if item == cur.elem:if cur == self.__head: # 判断要删除的是否为头节点self.__head = cur.nextelse:pre.next = cur.nextbreakelse:pre = curcur = cur.nextdef search(self, item):'''查找节点是否存在'''cur = self.__headwhile cur != None:if item == cur.elem:return Trueelse:cur = cur.nextreturn False

测试

if __name__ == '__main__':ll = SingleLinkList()print(ll.is_empty())print(ll.length())ll.append(1)print(ll.is_empty())print(ll.length())ll.append(2)ll.add(8)ll.append(3)ll.append(4)ll.append(5)ll.append(6)# 8 1 2 3 4 5 6ll.insert(-1, 9)  # 9 8 1 2 3 4 5 6ll.travel()ll.insert(3, 100)  # 9 8 1 100 2 3 4 5 6ll.travel()ll.insert(10, 200)  # 9 8 1 100 2 3 4 5 6 200ll.travel()print(ll.search(100))print(ll.search(1000))ll.remove(9) # 8 1 100 2 3 4 5 6 200ll.travel()ll.remove(100) # 8 1 2 3 4 5 6 200ll.travel()ll.remove(200) # 8 1 2 3 4 5 6ll.travel()

测试结果

True
0
False
1
9 8 1 2 3 4 5 6
9 8 1 100 2 3 4 5 6
9 8 1 100 2 3 4 5 6 200
True
False
8 1 100 2 3 4 5 6 200
8 1 2 3 4 5 6 200
8 1 2 3 4 5 6

链表与顺序表

顺序表优点在于存取元素的时候可以通过O(1)的方式一次性定位,缺点在于对于顺序表他的空间必须是连续的,如果一旦动态改变,整个存储区都得改变,且要存储的数据大时,一旦没有那么多的存储空间,顺序表就达不到要求了.
链表的特点在于对分散的内存空间能够达到充分的利用,缺点是需要存储next地址,占用空间大,在存取元素时,没有办法达到O(1)的效果,只能从头往后遍历。
虽然链表与顺序表在中间插入/删除时复杂度都是O(n),但链表的O(n)花在了遍历数据上,顺序表的O(n)花在了搬移数据上。

操作 链表 顺序表
访问 O(n) O(1)
头部插入/删除 O(1) O(n)
尾部插入/删除 O(n) O(1)
中间插入/删除 O(n) O(n)

【学习笔记】数据结构-单链表相关推荐

  1. 数据结构学习笔记:实现链表

    数据结构学习笔记:实现链表 1.结点结构 结点结构是由数据域和指针域组成,数据域是存放数据的,而指针域存放下一结点的地址. 2.链表结构 通过数据域访问到我们要的数据,而通过指针域访问到当前结点以后的 ...

  2. 数据结构-单链表基本操作(C语言实现)

    参考书:王道考研数据结构 (此贴为博主学习408的笔记,因博主也是学习者,个人总结如有错误欢迎指正.如有侵权请告知,马上删除致歉)​​ 单链表定义 单链表是线性表的链式存储,通过一组任意的存储单元来存 ...

  3. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

  4. 吴恩达《机器学习》学习笔记四——单变量线性回归(梯度下降法)代码

    吴恩达<机器学习>学习笔记四--单变量线性回归(梯度下降法)代码 一.问题介绍 二.解决过程及代码讲解 三.函数解释 1. pandas.read_csv()函数 2. DataFrame ...

  5. 数据结构 —— 单链表(超详细图解 接口函数实现)

    系列文章目录 数据结构 -- 顺序表 数据结构 -- 单链表 数据结构 -- 双向链表 数据结构 -- 队列 数据结构 -- 栈 数据结构 -- 堆 数据结构 -- 二叉树 数据结构 -- 八大排序 ...

  6. C语言数据结构单链表链表

    数据结构–单链表 学习了顺序表,我们发现顺序表在向里面存放数据的时候很麻烦,比如我们要使用头插法存放一个数据到顺序表的时候,我们要将整个表都向后挪一位,这个操作就让人很难受.那么有没有一种结构可以让我 ...

  7. 冰冰学习笔记:这些链表练习题,你会吗?(中)

    欢迎各位大佬光临本文章!!!   还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点 ...

  8. 20175330 数据结构-单链表(选做)

    要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList {     public static void mai ...

  9. 数据结构——单链表的C++实现

    数据结构--单链表的C++实现 \qquad单链表的创建.求长度.查找.插入和删除的C++实现. #include<iostream> using namespace std;//1.定义 ...

  10. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

最新文章

  1. 58回应“简历数据泄露”:将展开追查并加固安全系统
  2. 在Linux安装配置Tomcat 并部署web应用 ( 三种方式 )
  3. 7 ArcMap能复制,不能粘贴
  4. 根据class名 赋值_匿名内部类 类名规则
  5. 使用 cout 输出数据之控制输出格式(二)
  6. 【转】C++一次读取整个文件
  7. python中定义字符串_Python中的字符串String
  8. MVC 1.0的可能方法
  9. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
  10. 编译OpenJDK8:OpenJDK8与OpenJDK8u运行结果相差很大
  11. Redis使用pipeline批量查询所有键值对以及multiGet用法
  12. php网页显示中文乱码的解决办法!
  13. Elasticsearch X-Pack许可证过期解决办法
  14. mysql经典问题之group by和max函数
  15. 奉劝学弟学妹,学完JavaScript就该学TypeScript了,让我们一起了解TypeScript和如何去搭建运行环境吧
  16. matlab repeat until,汇编语言用.REPEAT和.WHILE伪指令实现循环
  17. 骚操作!公司招聘运营称已婚双休未婚单休
  18. (附源码)springboot电影选座订票app 毕业设计 011439
  19. EMC叶成辉:云存储是一门省钱的学问
  20. CSDN | 图片居中 | 图片改大小

热门文章

  1. Jetson Tegra X系列刷机教程
  2. 毁人不倦 - 大公司小公司
  3. scrapy框架爬虫
  4. 根据银行卡号查询银行卡名称
  5. Linux/Ubuntu的常用文件查找命令
  6. 日暮途远,故吾倒行而逆施之.
  7. killer Linux驱动下载,The Linux Killer
  8. 企业微信会员运营 打破传统营销方式开启全渠道会员营销新模式
  9. 计算机操作员操作题,[2017年精编]计算机操作员(初级)操作题.doc
  10. 画一个神经元的结构简图,神经元的简图画法