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 个结点

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

  1. java静态链表_数据结构笔记:静态链表(C语言)

    void CreateList(StaticLinkList *P)//创建一个静态链表 { int i; for(i=0;i此时并没有已占用空间,所以第一个节点中的指针(cur)的值为1,也就是说空 ...

  2. java链表的用法_数据结构(java语言描述)链表的使用

    1.定义node类,实现Node结点的构造函数(空结点和指定数值的结点),基本的获取结点的指针域,数据域,设置指针域,数据域. package class2; public class Node { ...

  3. python的内置数据结构可变不可变_如何在Python中实现不可变的数据结构?

    问题 您需要在Python中实现不可变的数据结构. 介绍.. 当您要防止多个人同时在并行编程中修改一条数据时,不可变数据结构非常方便.可变数据结构(例如Array)可以随时更改,而可变数据结构则不能更 ...

  4. python中sn的意思_python学习笔记

    学习资料:<简明 Python 教程.pdf>Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程. 特点:1.简单 2.易学 3.开源, ...

  5. python中列表是什么样的数据结构_Python中列表、字典、元组、集合数据结构整理...

    Python常见数据结构整理 Python中常见的数据结构可以统称为容器(container).序列(如列表和元组).映射(如字典)以及集合(set)是三类主要的容器. 一.序列(列表.元组和字符串) ...

  6. python中ndim是什么_使用Python中的ndim和shape属性获取darray数据的维度、长度、形状和其他参数,python,ndarray,等...

    我们在描述一个多维数组的时候,经常会用到两个参数:维度(dimension)和形状(shape),以二维数组为例,我们可以用矩阵来形象地联想这两个参数,对于矩阵,显然我们最常见的矩阵是二维的,所以他的 ...

  7. Python中单个下划线“ _”变量的用途是什么?

    这段代码中_ after for的含义是什么? if tbh.bag:n = 0for _ in tbh.bag.atom_set():n += 1 #1楼 下划线_在Python中被视为" ...

  8. Python中单个下划线“_”变量的目的是什么?

    在Python中,下划线_被视为" 我不关心 "或" 丢失 "变量 python解释器将最后一个表达式值存储到名为的特殊变量中_. >>> 1 ...

  9. python中列表的查_每日一记----python中的列表【查询和插入】

    首先说说什么是列表,先看官方解释:列表是python中的最基本的数据结构.那么既然是数据结构,肯定是用来存储数据的,我的理解中:列表就是一组数据按照一定的顺序进行存储.那我们用什么区确定每一个元素的位 ...

最新文章

  1. 基于python的界面自动化测试-基于 Python 的接口自动化测试实例
  2. cmd命令行导出的txt文本文档编码格式转换
  3. EF中 GroupJoin 与 Join
  4. java 可以重载等于号码_Java面试之Java基础4——重载与重写的区别
  5. Nodejs 分布式事务
  6. 加载osgb数据转换不能用_在ArcGIS Pro中OSGB数据转换及发布服务流程
  7. 任达华遇袭是效仿“宏颜获水”事件?百度回应:严惩肇事者 以儆效尤
  8. leetcode刷题:合并两个有序链表
  9. android file transfer下载_PHP通过header方式下载文件
  10. eclipse plugins
  11. )AIR程序打包/绿化,脱离air runtimes(AIR运行环境)的方法
  12. Android开发技术周报 Issue#101
  13. python_07 函数作用域、匿名函数
  14. 网站类项目商业计划书
  15. 计算机组成原理 / 反汇编实验(2)拆弹实验
  16. Golang 操作临时文件和目录
  17. 监听Home键和返回键
  18. 3 RRC 系统消息 SI
  19. 智能交通工程质量的第三方监测
  20. Power Query 系列 (12) - Power Query 结构化列应用案例

热门文章

  1. JavaFX技巧32:需要图标吗? 使用Ikonli!
  2. 有关有效企业测试的视频课程
  3. 使用ElasticSearch进行近实时索引
  4. intellij 使用_使用IntelliJ书签
  5. Spring Boot登录选项快速指南
  6. jpa和hibernate_使用JPA和Hibernate有效删除数据
  7. java 正则表达式使用_如何用正则表达式杀死Java
  8. 与Spring的计划任务一起按时运行
  9. rest spring_Spring的REST服务发现性,第5部分
  10. jQuery Ajax – Servlets集成:构建完整的应用程序