数据结构与算法-(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.head
        found = False
        stop = False
        while current != None and not found and not stop:
            if current.get_data() == item:
                found = True
            else:
                if current.get_data()  > item:
                    stop = True
                else:
                    current = current.get_next()
        return found

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

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

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

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

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

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

因此我们需要额外引用previous

    def add(self,item):
        #初始化两个外部引用(作用相当于指针)
        current = self.head#指针1
        previous = None#p2
        stop = False
        #判断循环是否继续执行,---循环停止,就是找到了新节点的插入位置
        while current != None and not stop:
            #发现插入位置
            if current.get_data() > item:
                stop = True
            else:
                previous = current
                current = 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_data
        self.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 = None

    def search(self,item):
        current = self.head
        found = False
        stop = False
        while current != None and not found and not stop:
            if current.get_data() == item:
                found = True
            else:
                if current.get_data()  > item:
                    stop = True
                else:
                    current = current.get_next()
        return found

    def add(self,item):
        current = self.head#指针1
        previous = None#p2
        stop = False
        while current != None and not stop:
            #发现插入位置
            if current.get_data() > item:
                stop = True
            else:
                previous = current
                current = 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.head
        count = 0
        while current != None:
            count += 1
            current = current.get_next()
        return count


    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found and current != None:
            if current.get_data() == item:
                found = True
            else:
                previous = current
                current = 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.head
        while 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()

链表分析

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

导言: 在当今数字化时代,网络犯罪分子不断进化,勒索病毒已经成为一种广泛传播的网络威胁。本文91数据恢复将深入介绍.halo勒索病毒,包括它的工作原理、如何从中恢复被加密的数据文件以及如何采取预防措施来保护自己免受感染。当面…

AD教程 (十)Value值的核对

AD教程 (十)Value值的核对 填写器件位号 直接根据原理图的原始编号进行更改 通过位号编辑器快速更改 点击工具,选择标注,选择原理图标注,进入位号编辑器 可以在位号编辑器中 设置处理顺序,从上往下还是从…

基于Skywalking的全链路跟踪实现

在前文“分布式应用全链路跟踪实现”中介绍了分布式应用全链路跟踪的几种实现方法,本文将重点介绍基于Skywalking的全链路实现,包括Skywalking的整体架构和基本概念原理、Skywalking环境部署、SpringBoot和Python集成Skywalking监控实现等。 1、Skywalki…

C#中的DataTable使用

在C#中,DataTable 是一个非常重要的组件,它是System.Data命名空间下的一部分。它用于在内存中存储表格数据,可以看作是一个内存中的数据库表。以下是DataTable的一些主要特点和常用的操作: 特点 内存中的数据存储:Da…

java入坑之类加载器

一、类加载机制 1.1类加载过程 类加载是Java虚拟机将类的字节码数据从磁盘或网络中读入内存,并转换成在JVM中可以被执行的Java类型的过程。类加载器是Java虚拟机的重要组成部分,负责加载和解析类的字节码,将其转换成Java虚拟机中的类对象&am…

14 http协议详解

1、http是应用层协议 统一资源定位符: 例如 http://www.jd.com是个URL,http是协议,www.jd.com是域名,表示互联网上的一个位置,有些url的资源定位会更清晰,比如http://www.jd.com/index.html 2、HTTP 请求…

【Solidity】Solidity中的基本数据类型和复合数据类型

1. 基本数据类型 1.1 整数类型 Solidity支持有符号整数和无符号整数,可以指定位数和范围。以下是一些整数类型的示例: int:有符号整数,可以是正数或负数。2,-45,2023 uint:无符号整数&#x…

TLS回调函数

TLS在逆向中的作用 TLS回调函数常用于反调试 TLS先于EP代码执行 TLS是什么 TLS是各线程的独立的数据存储空间 使用TLS技术可以在线程内部独立使用或修改进程的全局数据或静态数据 创建和终止某进程时,TLS回调函数都会自动调用执行 使用OD调试TLS函数

云尘靶场 --JIS-CTF-VulnUpload

重新下vpn连接的文件 还是fscan扫 访问一下13 到了/login.php 随便弱口令试试 好吧没成功,那目录扫描一下 那就先看一下robots.txt了 flag有点快的 抱着试一试的态度看一下admin_area 没想到源代码里面居然有 这么这么多 本来还以为密码要去爆破的&#xff0…

刚柔相济铸伟业 ——访湖南顺新金属制品科技有限公司董事长张顺新

时代在变,唯初心不改。 精致、谦虚、谨慎、儒雅、温和——他就是张顺新,湖南顺新金属制品科技有限公司、湖南顺新供应链管理有限公司董事长,民建长沙市委常委,民建湖南省环资委副主任,省、市民建企联会常务副会长&…

大文件传输小知识 | UDP和TCP哪个传输速度快?

在网络世界中,好像有两位“传输巨头”常常被提起:UDP和TCP。它们分别代表着用户数据报协议和传输控制协议。那么它们是什么?它们有什么区别?它们在传输大文件时的速度又如何?本文将深度解析这些问题,帮助企…

大数据Doris(十九):数据导入(Load)

文章目录 数据导入(Load) 一、Broker load 二、Stream load 三、Insert 四、Multi load

10 DETR 论文精读【论文精读】End-to-End Object Detection with Transformers

目录 DETR 这篇论文,大家为什么喜欢它?为什么大家说它是一个目标检测里的里程碑式的工作?而且为什么说它是一个全新的架构? 1 题目 2摘要 2.1新的任务定义:把这个目标检测这个任务直接看成是一个集合预测的问题 2.…

博途PLC增量式PID(支持正反作用和归一化输出)

博途PLC增量式PID算法详细介绍请参考下面文章链接: 【精选】博途1200/1500PLC增量式PID算法(详细SCL代码)_西门子博途pid csdn_RXXW_Dor的博客-CSDN博客文章浏览阅读3.4k次,点赞2次,收藏12次。SMART200PLC增量式PID可以参看下面这篇博文,文章里有完整的增量式PID算法公式,…

【JavaSE】基础笔记 - 类和对象(下)

目录 1、this引用 1.1、为什么要有this引用 1.2、什么是this引用 1.3、 this引用的特性 2、 对象的构造及初始化 2.1、 如何初始化对象 2.2、构造方法 2.2.1、概念 2.2.2、特性 2.3、默认初始化 2.4、就地初始化 上篇:【JavaSE】基础笔记 - 类和对象&#…

要在CentOS中安装Docker

Docker部署 在CentOS中安装Docker要在CentOS中安装Docker,请按照以下步骤进行操作:启动和校验常用命令查看容器启动容器 配置镜像加速 在CentOS中安装Docker 要在CentOS中安装Docker,请按照以下步骤进行操作: 首先,确…

c语言从入门到实战——函数递归

函数递归 前言1. 递归是什么?2. 递归的限制条件3. 递归举例3.1 举例1:求n的阶乘3.1.1 分析和代码实现3.1.2 画图推演 3.2 举例2:3.2.1 分析和代码实现3.2.2 画图推演 4. 递归与迭代 前言 函数递归是指一个函数直接或间接地调用自身&#xff…

AirTag追踪汽车

美国华盛顿特区,11月4日,在一项全新的抗击车辆盗窃的措施中,市长穆里尔•鲍泽签署了一项新计划,将向该市车辆盗窃频率较高的社区居民免费提供苹果AirTag追踪器。 AirTag是苹果公司推出的一款蓝牙跟踪设备,它依靠Findm…

Android sqlite 使用简介

进行Android应用开发时经常会用到数据库。Android系统支持sqlite数据库,在app开发过程中很容易通过SQLiteOpenHelper使用数据库,SQLiteOpenHelper依赖于Context对象,但是基于uiatomator1.0和Java程序等无法获取Context的应用如何使用数据库呢…

JavaWeb课程复习资料——idea创建JDBC

1、创建空的Java Project 输入项目名称 空项目 2、引入jar包步骤 依次点击 File -> Project Structure(快捷键 Ctrl Alt Shift s),点击Project Structure界面左侧的“Modules”如图: 在 【Dependencies】 标签界面下&…