无序表链表

定义

  • 一种数据项按照相对位置存放的数据集

抽象数据类型无序列表 UnorderedList

方法

  • list() 创建一个新的空列表。它不需要参数,而返回一个空列表。

  • add(item) 将新项添加到列表,没有返回值。假设元素不在列表中。

  • remove(item) 从列表中删除元素。需要一个参数,并会修改列表。此处假设元素在列表中。

  • search(item) 搜索列表中的元素。需要一个参数,并返回一个布尔值。

  • isEmpty() 判断列表是否为空。不需要参数,并返回一个布尔值。

  • size() 返回列表的元素数。不需要参数,并返回一个整数。

  • append(item) 在列表末端添加一个新的元素。它需要一个参数,没有返回值。假设该项目不在列表中。

  • index(item) 返回元素在列表中的位置。它需要一个参数,并返回位置索引值。此处假设该元素原本在列表中。

  • insert(pos,item) 在指定的位置添加一个新元素。它需要两个参数,没有返回值。假设该元素在列表中并不存在,并且列表有足够的长度满足参数提供的索引需要。

  • pop() 从列表末端移除一个元素并返回它。它不需要参数,返回一个元素。假设列表至少有一个元素。

  • pop(pos) 从指定的位置移除列表元素并返回它。它需要一个位置参数,并返回一个元素。假设该元素在列表中。

实现

  • 为了实现无序表数据结构,可以采用链接表的方案
  • 虽然列表数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项依次存放在连续的存储空间
  • 数据存放位置没有规则,但如果在数据项之间建立链向指向,就可以保持其前后相对位置

    第一个和最后一个数据项需要显示标记出来
  • 基本元素是节点Node
    • 每个节点至少包含2个信息:

      • 数据项本身
      • 指向下一个节点的引用信息,next为None代表没有下一个节点
  • 可以采用链接节点的方式构建数据集来实现无序表
  • 链表的第一个和最后一个节点最重要

    必须冲第一个节点head开始沿着链接遍历下去
  1. class Node:
  2. def __init__(self, initdata):
  3. self.data = initdata
  4. self.next = None
  5. def getData(self):
  6. return self.data
  7. def getNext(self):
  8. return self.next
  9. def setData(self, newdata):
  10. self.data = newdata
  11. def setNext(self, newnext):
  12. self.next = newnext
  13. if __name__ == "__main__":
  14. temp = Node(93)
  15. print(temp.getData())
  1. class UnorderedList:
  2. def __init__(self):
  3. self.head = None
  4. def isEmpty(self):
  5. return self.head == None
  6. def add(self, item):
  7. temp = Node(item)
  8. temp.setNext(self.head)
  9. self.head = temp
  10. def size(self):
  11. current = self.head
  12. count = 0
  13. while current != None:
  14. count += 1
  15. current = current.getNext()
  16. return count
  17. def search(self, item):
  18. current = self.head
  19. found = False
  20. while current != None and not found:
  21. if current.getData() == item:
  22. found = True
  23. else:
  24. current = current.getNext()
  25. return found
  26. def remove(self, item):
  27. current = self.head
  28. previous = None
  29. found = False
  30. while not found:
  31. if current.getData() == item:
  32. found = True
  33. else:
  34. previous = current
  35. current = current.getNext()
  36. if previous == None:
  37. self.head = current.getNext()
  38. else:
  39. previous.setNext(current.getNext())

有序表

定义

  • 有序表是一种数据项依据其某种可比性质(如整数大小,字母表先后)来决定在列表中的位置
  • 越“小”的数据项越靠近列表的头,越靠“前”

抽象数据类型:有序列表

操作

  • OrderedList():创建一个新的空有序列表。它返回一个空有序列表并且不需要传递任何参数。

  • add(item):在保持原有顺序的情况下向列表中添加一个新的元素,新的元素作为参数传递进函数而函数无返回值。假设列表中原先并不存在这个元素。

  • remove(item):从列表中删除某个元素。欲删除的元素作为参数,并且会修改原列表。假设原列表中存在欲删除的元素。

  • search(item):在列表中搜索某个元素,被搜索元素作为参数,返回一个布尔值。

  • isEmpty():测试列表是否为空,不需要输入参数并且其返回一个布尔值。

  • size():返回列表中元素的数量。不需要参数,返回一个整数。

  • index(item):返回元素在列表中的位置。需要被搜索的元素作为参数输入,返回此元素的索引值。假设这个元素在列表中。

  • pop():删除并返回列表中的最后一项。不需要参数,返回删除的元素。假设列表中至少有一个元素。

  • pop(pos):删除并返回索引 pos 指定项。需要被删除元素的索引值作为参数,并且返回这个元素。假设该元素在列表中。

实现

  • 采用链表方法实现
  • Node定义相同
  • OrderedList也设置一个head来保存链表表头的引用
  • search方法
    • 无序表中,如果需要查找的数据项不存在,则会搜遍整个链表,直到表尾
    • 对于有序表,可以利用链表节点有序排列的特性,来为search节省不存在数据项的查找时间
  • add方法
    • 必须保证加入数据添加在合适的位置,以维护整个链表的有序性
    • 要和remove方法类似,引用一个previous的引用,跟随当前节点current
  1. class Node:
  2. def __init__(self, initdata):
  3. self.data = initdata
  4. self.next = None
  5. def getData(self):
  6. return self.data
  7. def getNext(self):
  8. return self.next
  9. def setData(self, newdata):
  10. self.data = newdata
  11. def setNext(self, newnext):
  12. self.next = newnext
  13. if __name__ == "__main__":
  14. temp = Node(93)
  15. print(temp.getData())
  1. def OrderedList:
  2. def __init__(self):
  3. self.head = None
  4. def isEmpty(self):
  5. return self.head == None
  6. def add(self, item):
  7. current = self.head
  8. previous = None
  9. stop= False
  10. while current != None and not stop:
  11. if current.getData()>item:
  12. stop=True
  13. else:
  14. previous=current
  15. current=current.getNext()
  16. temp=Node(item)
  17. if previous==None:
  18. temp.setNext(self.head)
  19. self.head=temp
  20. else:
  21. temp.setNext(current)
  22. previous.setNext(temp)
  23. def size(self):
  24. current = self.head
  25. count = 0
  26. while current != None:
  27. count += 1
  28. current = current.getNext()
  29. return count
  30. def search(self, item):
  31. current = self.head
  32. found = False
  33. stop= False
  34. while current != None and not found and not stop:
  35. if current.getData() == item:
  36. found = True
  37. else:
  38. if current.getData()>item:
  39. stop=True
  40. else:
  41. current = current.getNext()
  42. return found
  43. def remove(self, item):
  44. current = self.head
  45. previous = None
  46. found = False
  47. while not found:
  48. if current.getData() == item:
  49. found = True
  50. else:
  51. previous = current
  52. current = current.getNext()
  53. if previous == None:
  54. self.head = current.getNext()
  55. else:
  56. previous.setNext(current.getNext())

链表实现的算法分析

  • 对于链表复杂度的分析,主要看方法是否涉及到链表的遍历

    • isEmpty O(1)
    • size O(n)
    • search/remove O(n)
    • 有序表 add O(n)
    • 无序表 add O(1)
  • 链表实现的List,跟python内置的列表数据类型,在有些相同方法的实现上的时间复杂度不同。

    原因在于python内置的列表数据类型是基于顺序存储来实现的,并进行了优化

【数据结构与算法Python版学习笔记】基本数据结构——列表 List,链表实现的更多相关文章

  1. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  2. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  3. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  4. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  5. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  6. 【数据结构与算法Python版学习笔记】树——相关术语、定义、实现方法

    概念 一种基本的"非线性"数据结构--树 根 枝 叶 广泛应用于计算机科学的多个领域 操作系统 图形学 数据库 计算机网络 特征 第一个属性是层次性,即树是按层级构建的,越笼统就越 ...

  7. 【数据结构与算法Python版学习笔记】目录索引

    引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...

  8. 【数据结构与算法Python版学习笔记】递归(Recursion)——优化问题与策略

    分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 ...

  9. 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树

    最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...

随机推荐

  1. Python之requests模块-response

    response类故名思议,它包含了服务器对http请求的响应.每次调用requests去请求之后,均会返回一个response对象,通过调用该对象,可以查看具体的响应信息. 示例如下: import ...

  2. jenkins AWS CodeDeploy不停机部署

    此项目的特点是把Jenkins与CodeDeploy相结合做的CICD做的蓝绿发布,CI与CD 是分开的,CI构建完以后以BuildNumber的形式把war包存至AWS的S3桶中.同时在java项目 ...

  3. MongoDB(3)- Database 数据库相关

    Database MongoDB 将数据记录存储为文档(特别是 BSON 文档) 这些文档在集合中聚集在一起 数据库存储一个或多个文档集合. 在 MongoDB 里面存在数据库的概念,但没有模式 Sh ...

  4. jvm学习笔记:类加载过程

    类加载器子系统 类加载器的作用是加载class文件到内存 加载阶段->链接阶段->初始化阶段 ClassLoader只负责class文件的加载,至于是否能够运行由执行引擎判断 加载的类信息 ...

  5. linux常用查询命令

    1 **系统** 2 # uname -a # 查看内核/操作系统/CPU信息 3 # head -n 1 /etc/issue # 查看操作系统版本 4 # cat /proc/cpuinfo # ...

  6. Object.keys( )与 for in 区别

    for in 一般用于对象的遍历: let obj = { a:1, b:2, } for(let key in obj){ console.log(key) } // a // b Object.k ...

  7. [第十五篇]——Swarm 集群管理之Spring Cloud直播商城 b2b2c电子商务技术总结

    Swarm 集群管理 简介 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Dock ...

  8. 从输入 URL 到展现页面的全过程

    总体分为以下几个过程 DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP报文 浏览器解析渲染页面 连接结束 DNS解析 域名到ip地址转换 TCP连接 HTTP连接是基于TCP连接 ...

  9. 剑指 Offer 60. n个骰子的点数

    剑指 Offer 60. n个骰子的点数 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s.输入n,打印出s的所有可能的值出现的概率. 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n ...

  10. java线程day-02

    1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作 2.多线程的应用场景 * 红蜘蛛同时共享屏幕给多个电脑 * 迅 ...