数据结构与算法-(11)---有序表(OrderedList)

🌈个人主页: Aileen_0v0
🔥系列专栏:PYTHON学习系列专栏
💫"没有罗马,那就自己创造罗马~" 

目录

知识回顾及总结 

有序表的引入

​编辑 实现有序表

1.有序表-类的构造方法

2.有序表-search方法的实现 

3.有序表-add方法的实现

有序链表 - 完整实现过程

链表分析


知识回顾及总结 

上一次我们学习了无序表之链表和列表,知道了链表的特点是顺藤摸瓜结构

通俗的讲就是链表相当于火车(如果元素放在链表后面,找那个车厢需要从头开始往后找)

有序表的引入

今天,我们来学习有序表- OrderedList-需要增加属性进行位置参照-所以需要对表头进行处理

有序表是一种数据项依照其某可比性质如整数大小、字母表先后)来决定在列表中的位置
数值越小位置越前,数值越大位置越后.

 

 实现有序表

1.有序表-类的构造方法

class Orderedlist:def __init__(self):self.head = None

2.有序表-search方法的实现 

 之前,我们无序表搜索,需要遍历节点,直到找到目标节点,或者没有节点可以继续访问.

但是,对于有序表,如果目标元素不在列表中,可以利用元素有序的特点终止寻找.

只要节点中的值比正在查找的值更大,搜索会立刻结束并返回False,因为查找的元素不可能存在于链表后续的节点中.

    def search(self,item):current = self.headfound = Falsestop = Falsewhile current != None and not found and not stop:if current.get_data() == item:found = Trueelse:if current.get_data()  > item:stop = Trueelse:current = current.get_next()return found

3.有序表-add方法的实现

相对于无序列表来说,有序列表,需要修改最多的是add方法.

对于无序表:add方法将一个节点放在最容易访问的位置,即列表头部.

对于有序列表:需要在需要在已有链表中,为新节点找到正确的插入位置.

当访问完所有节点(current是None) 或者 当前值大于要添加的元素时,就找到了插入位置,如上图中,找到54即可停止查找.

有序表和无序表一样,由于current本身无法提供对待修改节点进行访问,

因此我们需要额外引用previous

    def add(self,item):#初始化两个外部引用(作用相当于指针)current = self.head#指针1previous = None#p2stop = False#判断循环是否继续执行,---循环停止,就是找到了新节点的插入位置while current != None and not stop:#发现插入位置if current.get_data() > item:stop = Trueelse:previous = currentcurrent = current.get_next()temp = Node(item)#插在表头if previous == None:temp.set_next(self.head)self.head = temp#插在表中else:temp.set_next(current)previous.set_next(temp)

有序链表 - 完整实现过程

其它实现过程类似于无序表,可以自己尝试练习一下~

这里是我的实现过程,仅供大家学习参考.

class Node:#结点Node相当于车厢def __init__(self,init_data):self.data = init_dataself.next = None#获得数据项def get_data(self):return self.data#获得节点def get_next(self):return self.next#设置数据项def set_data(self,new_data):self.data = new_data#属性#设置节点def set_next(self,new_next):self.next = new_next#属性class Orderedlist:def __init__(self):self.head = Nonedef search(self,item):current = self.headfound = Falsestop = Falsewhile current != None and not found and not stop:if current.get_data() == item:found = Trueelse:if current.get_data()  > item:stop = Trueelse:current = current.get_next()return founddef add(self,item):current = self.head#指针1previous = None#p2stop = Falsewhile current != None and not stop:#发现插入位置if current.get_data() > item:stop = Trueelse:previous = currentcurrent = current.get_next()temp = Node(item)#插在表头if previous == None:temp.set_next(self.head)self.head = temp#插在表中else:temp.set_next(current)previous.set_next(temp)def size(self):current = self.headcount = 0while current != None:count += 1current = current.get_next()return countdef remove(self, item):current = self.headprevious = Nonefound = Falsewhile not found and current != None:if current.get_data() == item:found = Trueelse:previous = currentcurrent = current.get_next()if found:if previous == None:self.head = current.get_next()else:previous.set_next(current.get_next())def traverse(self):current = self.headwhile current != None:print(current.get_data())current = current.get_next()ol = Orderedlist()
ol.add(7)
ol.add(9)
ol.add(6)
ol.add(8)
ol.add(10)
print(ol.search(6))
ol.traverse()

链表分析

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

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

相关文章

【技术类-01】doc转PDF程序卡死的解决方案,

摘要: 1、出现 raise AttributeError("%s.%s" % (self._username_, attr))) 2、表现:doc转PDF卡死(白条不动或出现以上英文) 3、解决:在docx保存代码行后面加上time.sleep(3) 4、原因&#x…

SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用 软件环境: JDK 1.8 SpringBoot 2.2.1 Maven 3.2…

Java进阶篇--线程池之FutureTask

目录 FutureTask简介 FutureTask的基本使用 FutureTask的应用场景 FutureTask简介 FutureTask是Java中的一个类,用于表示可获取结果的异步任务。它实现了java.util.concurrent.Future接口,提供了启动和取消异步任务、查询任务是否已完成以及获取最终…

腾讯云3年云服务器价格及购买教程

腾讯云作为国内领先的云计算服务提供商,提供了多种优惠的云服务器套餐,以满足不同用户的需求,本文将详细介绍腾讯云3年云服务器价格及购买教程,新老用户均可购买! 1、活动页面:传送门>>> 2、进入…

P3379 【模板】最近公共祖先(LCA)

洛谷里面8页题解千篇一律,就没有用线段树求解的,这下不得不由本蒟蒻来生啃又臭又硬,代码又多的线段树了。 样例的欧拉序列:4 2 4 1 3 1 5 1 4 记录每个节点最早在欧拉序列中的时间,任意两个节点的LCA就是他们两个节点…

Flink -- 状态与容错

1、Stateful Operations 有状态算子: 有状态计算,使用到前面的数据,常见的有状态的算子:例如sum、reduce,因为它们在计算的时候都是用到了前面的计算的结果 总结来说,有状态计算并不是独立存在的&#xf…

ssh免密登录

单机 1 生成密钥 执行 ssh-keygen -t rsa ( 其中 rsa 是非对称算法) 一路回车到底,生成密钥 且生成之后会在用户的根目录生成一个 “.ssh”的文件夹 2 添加公钥到 将 公钥内容追加到 authorized_keys 中: cat ~/.ssh/id_rsa.pub …

汽车网络安全渗透测试概述

目录 1.汽车网络安全法规概述 1.1 国外标准 1.2 国内标准 2.汽车网络安全威胁分析 2.1 汽车网络安全资产定义 2.2 汽车网络安全影响场景及评级示例 3.汽车网络安全渗透测试描述 3.1 参考法规 3.2 渗透测试内容 4.小结 1.汽车网络安全法规概述 近年来,汽车…

科技创意赋能乡村文旅振兴

近日,由北京大学创意产业研究中心联合中国国际科技促进会新基建专委会共同主办的“科技创意赋能乡村振兴研讨会”在京举行,与会专家学者围绕“和美乡村共同富裕智慧文旅”主题进行深入探讨。北京大学创意产业研究中心副主任吕艺、国家文化和旅游公共服务…

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局(LinearLayout) 2. 相对布局(RelativeLayout) 3. 表格布局(TableLayout) 4. 帧布局(FrameLayout) 5. 网格布局(GridLayout&#xff0…

Linux 学习(CentOS 7)

CentOS 7 学习 Linux系统内核作者: Linux内核版本 内核(kernel)是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。 Linux内核版本又分为稳定版和开发版,两种版本是相互关联&am…

【小白专用】VSCode下载和安装与配置PHP开发环境(详细版) 23.11.08

1. 下载VSCode2. 解决VSCode下载速度特别慢3. 安装VSCode 一、VSCode介绍 VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和 Git 版本控制系统。 二、官方下载地址…

网络带宽基础知识简单介绍

网络带宽基础知识简单介绍 前言一、网络带宽是什么?二、影响网络带宽的因素三、网络带宽的单位总结 前言 最近一些需求涉及到了网络带宽,整理后有了本文 一、网络带宽是什么? 网络带宽是指在单位时间内(一般指的是1秒钟&#xf…

django+drf+vue 简单系统搭建 (1) - django创建项目

本系列文章为了记录自己第一个系统生成过程,主要使用django,drf,vue。本人非专业人士,此文只为记录学习,若有部分描述不够准确的地方,烦请指正。 建立这个系统的原因是因为,在生活中,很多觉得可以一两行代码…

Flutter的专属Skia引擎解析+用法原理

Skia是一款跨平台的2D图形库,是Google公司开发的,可以用于开发各种应用程序,如浏览器、游戏、移动应用程序等。Skia引擎的主要特点是速度快、可移植性强、占用的内存少、稳定性佳,适用于多种硬件平台。 Skia的目标是提供快速、高…

基于GCC的工具objdump实现反汇编

一:objdump介绍 在 Linux中,一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…

kubernetes集群编排(7)

目录 k8s认证授权 pod绑定sa 认证 授权 k8s认证授权 pod绑定sa [rootk8s2 ~]# kubectl create sa admin //在当前 Kubernetes 集群中创建一个名为 "admin" 的新服务账户[rootk8s2 secret]# vim pod3.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec…

Paste v4.1.2(Mac剪切板)

Paste for Mac是一款运行在Mac OS平台上的剪切板小工具,拥有华丽的界面效果,剪切板每一条记录可显示(预览)文本,图片等记录的完整内容,可以记录最近指定条数的剪切板信息,方便用户随时调用&…

软件测试入门之接口测试

首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…

思维模型 首因效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。先入为主,一见钟情。 1 首因效应的应用 1.1 面试中的首因效应 小李是一名应届毕业生,他准备参加一家知名互联网公司的面试。在面试前,他做了充分的准备…