python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...

https://www.xin3721.com/eschool/pythonxin3721/

(一)数组

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

1、数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。

通过 a[i]_address = a[0]_address + i*元素的大小(字节) ,得到a[i]所在的位置。

2、插入:

数组长度为n,在索引k插入一个元素,k~n的元素都需要向后搬移。时间复杂度为O(n)。(在末尾插入时间复杂度O(1),首位插入则为O(n),平均时间复杂度为O(n))

如果数组是无序的,可以在末尾插入,再和第k个元素互换,实现O(1)时间复杂度复杂度的插入。

3、删除

和插入类似。数组长度为n,删除第k个元素,则k+1~n的元素都需要向前搬移一位,时间复杂度为o(n)。

如果数组是无序的,可以将末尾的元素和第k个元素互换位置,然后再删除,实现O(1)时间复杂度的删除。

(二)链表

1、数组与链表在底层存储结构上的区别

(1)数组需要一段连续的内存空间,链表则不需要

(2)链表通过“指针”,将一组零散的内存空间串联在一起。

2、常用的链表结构

(1)单链表

(2)双向链表

(3)循环链表

3、单链表

(1)把内存块(data)称为链表的“结点”,用于存储数据。next记录下一个节点的内存地址,把这个记录下个结点地址的指针称为后继指针next。

(2)第一个结点称为头结点,最后一个结点称为尾结点。尾结点的指针不是指向下一个结点,而是指向一个空地址NULL,表示这是链表的最后一个结点。

(3)链表插入、删除的时间复杂度O(1),只需要修改指针即可。

(4)链表随机访问的时间复杂度是O(n)。因为链表的内存空间是零散的,没法像数组那样通过简单的寻址公式实现随机访问,只能一个一个结点依次遍历,直到找到相应的结点。

4、循环链表

和单链表唯一的区别就在于尾结点,尾结点的指针指向头结点,而不是空地址。

5、双向链表

(1)相比单链表,多了一个前驱指针,指向前一个结点

(三)练习题

1、单链表反转。 leetcode : 206

1 #迭代方式

2 classListNode:3 def __init__(self, x):4 self.val =x5 self.next =None6

7 classSolution:8 def reverseList(self, head: ListNode) ->ListNode:9 if head is None or head.next isNone:10 returnhead11 prev_node =None12 while head is notNone:13 next_node = head.next #备份下一结点的内存地址

14 head.next = prev_node #当前结点的指针指向前一结点(头结点指向None)

15 prev_node = head #更新前一结点的值。

16 head = next_node #设置当前结点为下一结点的地址

17 returnprev_node18

19 if __name__ == "__main__":20 l1 = ListNode(1)21 l1.next = ListNode(2)22 l1.next.next = ListNode(3)23 l1.next.next.next = ListNode(4)24 l1.next.next.next.next = ListNode(5)25 rev_result =Solution().reverseList(l1)26 for i in range(6):27 if rev_result is notNone:28 print(rev_result.val)29 rev_result =rev_result.next30 else:31 print(rev_result)

1 #递归方式

2 classListNode:3 def __init__(self, x):4 self.val =x5 self.next =None6

7 classSolution:8 def reverseList(self, head: ListNode) ->ListNode:9 if head is None or head.next isNone:10 returnhead11 next_node =self.reverseList(head.next)12 head.next.next =head13 head.next =None14 returnnext_node15 """

16 递归和迭代不同的是,递归从后向前,迭代从前往后17 1、 head.val = 418 4.next.next = head, 实际就是5的指针指向结点4的内存地址19 4.next = None ,断开之前 4 -> 5 的指针20 2、 head.val = 321 3.next.next = head, 实际就是4的指针指向结点3的内存地址22 3.next = None , 断开之前 3 -> 4 的指针23 ...24 4: head.val = 125 1.next.next = head, 实际就是2的指针指向结点1的内存地址26 1.next = None ,头结点指向None27 """

28 if __name__ == "__main__":29 l1 = ListNode(1)30 l1.next = ListNode(2)31 l1.next.next = ListNode(3)32 l1.next.next.next = ListNode(4)33 l1.next.next.next.next = ListNode(5)34 rev_result =Solution().reverseList(l1)35 for i in range(6):36 if rev_result is notNone:37 print(rev_result.val)38 rev_result =rev_result.next39 else:40 print(rev_result)

2、链表中环的检测: leetcode 141

1 #Definition for singly-linked list.

2 #class ListNode:

3 #def __init__(self, x):

4 #self.val = x

5 #self.next = None

6

7 classSolution:8 def hasCycle(self, head: ListNode) ->bool:9 flag =True10 while head is notNone:11 next_node =head.next12 if next_node is None: #如果指针的值为None,表示没有环

13 returnFalse14 elif next_node == True: #如果指针的值为True,表示有环

15 returnTrue16 head.next = flag #将结点指针的值设置为True

17 head = next_node #head 设置为下一结点

18 return False

3、两个有序的链表合并

1 #Definition for singly-linked list.

2 classListNode:3 def __init__(self, x):4 self.val =x5 self.next =None6

7 classSolution:8 def mergeTwoLists(self, l1: ListNode, l2: ListNode) ->ListNode:9 new_node = ListNode("K")10 move = new_node #加一个move,是为了让new_node一直代表头结点,方便返回数据

11 while l1 andl2:12 if l1.val >l2.val:13 move.next =l214 l2 =l2.next15 else:16 move.next =l117 l1 =l1.next18 move =move.next19 move.next = l1 if l1 elsel220 returnnew_node.next21

22

23

24 if __name__ == "__main__":25 l1 = ListNode(1)26 l1.next = ListNode(2)27 l1.next.next = ListNode(3)28 l2 = ListNode(1)29 l2.next = ListNode(3)30 l2.next.next = ListNode(4)31 result =Solution().mergeTwoLists(l1,l2)32 for i in range(6):33 print(result.val)34 result = result.next

4、删除链表倒数第 n 个结点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旋转散点图_聚类分析的结果如何用散点图展示出来?

SPSS系统聚类输出的树状图广受用户喜爱,二阶聚类也可以输出一系列美观的可视化图形用来观察聚类效果,但我们发现Kmeans均值聚类没有提供可视化程度高的图形,那怎么办,我们自己来制作。数据小兵推荐使用3D散点图全方位观察K均值聚类…

async 打包异常_重新打包流中的异常

async 打包异常Java 8已有两年历史,但是仍然存在社区尚未为其开发好的解决方案库的用例,甚至边缘用例。 如何处理流管道中的检查异常就是这样一个问题。 Stream操作接受的功能接口不允许实现抛出已检查的异常,但是我们可能要调用许多方法。 显…

补码基础

关于补码,有如下比较有趣的演化过程: 假如计算机中使用 4 位的二进制表示数据,如图-2,最多能表示 0 到 15(10 进制),之后有牛人做了 一个细微改动,如图-3,将所有二进制以 1 开头的数(大于 7 的数)放到 0 之…

身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」

作者:沫沫 政采云前端团队转发链接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ前言近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸识别技术取得了突破性进展,准确率显著提高。现阶段,人…

打开 谷歌浏览器exe_专治各种网银不服:两步开启微软Edge浏览器IE兼容模式

此前微软已经预告过Microsoft Edge将支持IE模式,即可以在该浏览器下使用IE模式加载某些特定的需要的网站。不过在后续更新中微软又突然改口不再面向普通用户提供此功能,而企业级用户若要使用还需要管理员提前配置。现在这款浏览器的正式版已经发布&#…

java单例枚举_Java增强枚举的用例

java单例枚举Brian Goetz在消息“ 增强枚举-用例 ”中写道:“我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈。” 他陈述了他的消息的第一个目的:“开始工作,这是一些通用枚举可能有用的典型用例。” 所提供的两个示例中的第一个示例是重…

爱python网_Python

一、PIL库简介1.安装PIL库PIL库是Python的第三方库,需要手动通过pip工具安装。可通过cmd命令:pip install pillow 进行安装。(注意:出现pip不是内部处理命令时需要配置一下环境)。2.PIL库的功能PIL库支持图像存储、显示和处理,它…

python计算互信息_互信息公式及概述

在概率论和信息论中,两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。不同于相关系数,互信息并不局限于实值随机变量,它更加一般且决定着联合分布 p(X,Y) 和分解的边缘分…

队列和消息队列_消息队列概述[幻灯片]

队列和消息队列昨天,我进行了一次演讲,探讨了使用消息队列的所有方面。 我以前曾写过“您可能不需要消息队列” –现在的结论有些细微差别,但我仍然坚持简单性的观点。 演讲探讨了使用消息队列的各种好处和用例,并讨论了典型“消…

反码、原码、补码的观点阐述

我自己是不认可所谓的原码、反码的说法,但是很多人在计算负数的二进制时,都会使用反码和原码的概念,我这里就简单梳理下吧。 十进制2的二进制数(按8位的二进制举例)如下: 原码:0000 0010 补码&…

aspose word 获取标题_Word干货|多级标题的自动编号怎么添加?

在对Word文档进行排版时,大家普遍认为的一个难点就是对多级标题添加自动编号,本期Word妹与大家分享相关技巧的使用。1、添加样式选中文本,点击开始——样式——选择标题1,相同的样式则可以借用F4来实现。PS:以同样方式…

python使用elasticsearch_python中使用ElasticSearch(二)

一、数据库和elasticsearch的对比分析二、kibana中常用的命令。1.新建数据。2.查询上一步中存进去的数据。3.put修改字段(这个操作要小心,容易误操作,清楚其他的字段)4.post修改字段5.查询的基本操作。(1)全部查询(类似于select * from fruit)(2)有条件的…

vue.jsr入门_JSR 365更新:深入CDI 2.0

vue.jsr入门上下文和依赖注入2.0( JSR 365 )是CDI 1.2的更新,CDI 1.2目前是Java EE 7平台的一部分。 目前处于公开审查阶段 。 对于不熟悉CDI的那些人,它定义了一组功能强大的免费服务,这些服务可充当凝胶,…

Java集合类梳理

文章目录集合框架CollectionListList常用方法ArrayListArrayList常用方法LinkedListLinkedList常用方法VectorVector 常用方法StackStack 常用方法SetHashSetHashSet 常用方法LinkedHashSetLinkedHashSet 常用方法TreeSetTreeSet常用方法EnumSetEnumSet 常用方法MapHashMapHash…

增加第三方插件_AE插件排行!!

大家好是万能的懒懒酱After effects为视觉效果艺术家和动画设计师带来了大量的效果。然而,第三方开发人员提供了更多独特插件,供After Effects使用。在这里可以帮助你了解哪些插件是最流行的最受欢迎的。第10名:Looks(多功能调色插…

mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)

1 签到定义以及作用签到,指在规定的簿册上签名或写一“到”字,表示本人已经到达。在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查询. 传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查…

java包装项目_项目包装组织

java包装项目程序包是Java的基本概念,是您开始用该语言编程时偶然发现的第一件事。 作为一个初学者,您可能不太关注软件包的结构,但是随着您成为经验丰富且成熟的软件开发人员,您开始考虑可以采取哪些措施来提高其效率。 有几个主…

如何开发 Servlet 程序

文章目录如何开发 Servlet步骤 1:写一个类步骤 2:编译步骤 3:打包步骤 4:部署步骤 5:启动服务器步骤 6:访问 servletServlet 开发示例不使用 IDE 开发(手动编译和部署)步骤 1&#x…

报任安书文言现象_语文老师精心总结【文言文常考点】够你从初一用到初四!...

点击本号菜单栏 免费获取学习资料▼今天给大家整理了初中文言文的一些常用知识点:特殊句式和古今异义,这些只是文言文学习模块中的一部分,除此之外,其他大家需要在平时积累的文言文知识点有下面这些:文言文高频词、古代…

参数化测试 junit_JUnit 5 –参数化测试

参数化测试 junitJUnit 5令人印象深刻,尤其是当您深入研究扩展模型和体系结构时 。 但是从表面上讲,编写测试的地方,开发的过程比革命的过程更具进化性 – JUnit 4上没有杀手级功能吗? 幸运的是,至少有一个&#xff1a…