当前位置: 首页 > news >正文

数据结构 | 线性数据结构——列表

目录

一、无序列表抽象数据类型

二、实现无序列表:链表

2.1 Node类

2.2 UnorderedList类

三、有序列表抽象数据类型

四、实现有序列表


列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置。更具体地说,这种列表成为无序列表。可以认为列表有第一个元素、第二个元素。第三个元素,等等;也可以称第一个元素为列表的起点,称最后一个元素为列表的终点。为简单起见,我们假设列表中没有重复的元素。

一、无序列表抽象数据类型

如前所述,无序列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置。以下是无序列表支持的操作。

  • List()创建一个空列表。它不需要参数,且会返回一个空列表。
  • add(item)假设元素item之前不在列表中,并向其中添加item。它接受一个元素作为参数,无返回值。
  • remove(item)假设元素item之前已经在列表中,并从其中移除item。它接受一个元素作为参数,并且修改列表。
  • search(item)在列表中搜索元素item。它接受一个元素作为参数,并且返回布尔值。
  • isEmpty()检查列表是否为空。它不需要参数,并且返回布尔值。
  • length()返回列表中元素的个数。它不需要参数,并且返回一个整数。
  • append(item)假设元素item之前不在列表中,并在列表的最后位置添加item。它接受一个元素作为参数,无返回值。
  • index(item)假设元素item已经在列表中,并返回该元素在列表中的位置。它接受一个元素作为参数,并且返回该元素的下标。
  • insert(pos,item)假设元素item之前不在列表中,同时假设pos是合理的值,并在位置pos处添加元素item。它接受两个参数,无返回值。
  • pop()假设列表不为空,并移除列表中的最后一个元素。它不需要参数,且会返回一个元素。
  • pop(pos)假设在指定位置pos存在元素,并移除该位置上的元素。它接受位置参数,且会返回一个元素。

二、实现无序列表:链表

为了实现无序列表,我们要构建链表。无序列表需要维持元素之间的相对位置,但是并不需要在连续的内存空间中维护这些位置信息。如果可以为每一个元素维护一份信息,即下一个元素的位置,那么这些元素的相对位置就能通过指向下一个元素的链接来表示。

需要注意的是,必须指明列表中第一个元素的位置。一旦知道第一个元素的位置,就能根据其中的链接信息访问第二个元素,接着访问第三个元素,依此类推。指向链表第一个元素的引用被称作。最后一个元素需要知道自己没有下一个元素。

2.1 Node类

节点是构建链表的基本数据结构。每一个节点对象都必须持有至少两份信息。首先,节点必须包含列表元素,我们称之为节点的数据变量。其次,节点必须保存指向下一个节点的引用。在构建节点时,需要为其提供初始值。Node类也包含访问和修改数据的方法,以及指向下一个元素的引用。

>>> temp=Node(93)
>>> temp.getData()
93

特殊的Python引用值None在Node类以及之后的链表中起到了重要的作用。指向None的引用代表着后面没有元素。注意,Node的构造方法将next的初始值设为None。由于这有时被称为“将节点接地”,因此,我们使用接地符号来代表指向None的引用。将None作为next的初始值是不错的做法。

class Node:def __init__(self,initdata):self.data=initdataself.next=Nonedef getData(self):return self.datadef getNext(self):return self.nextdef setData(self,newdata):self.data=newdatadef setNext(self,newnext):self.next=newnext

2.2 UnorderedList类

如前所述,无序列表是基于节点集合来构建的,每一个节点都通过显式的引用指向下一个节点。只要知道第一个节点的位置(第一个节点包含第一个元素),其后的每一个元素都能通过下一个引用找到。因此,UnorderedList类必须包含指向第一个节点的引用。注意,每一个列表对象都保存了指向列表头部的引用

UnorderedList类的构造方法如下:

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

最开始构建列表时,其中没有元素。与在Node类中一样,特殊引用值None用于表明列表的头部没有指向任何节点。列表的头部指向包含列表的第一个元素的节点,这个节点包含指向下一个节点(元素)的引用,依此类推。非常重要的一点是,列表类本身并不包含任何节点对象,而只有指向整个链表结构中第一个节点的引用。

isEmpty方法如下:

def isEmpty(self):return self.head==None

isEmpty方法检查列表的头部是否为指向None的引用。布尔表达式self.head==None当且仅当链表中没有节点才为真。由于新的链表是空的,因此构造方法必须和检查是否为空保持一致。这体现了使用None表示链表末尾的好处。在Python中,None可以和任何引用进行比较。如果两个引用都指向同一个对象,那么它们就是相等的。

由于链表只提供一个入口(头部),因此其他所有节点都只能通过第一个节点以及next链表来访问。这意味着添加新节点最简便的位置就是头部,或者说链表的起点。我们把新元素作为列表的第一个元素,并且把已有的元素链接到该元素的后面。

add方法如下:

def add(self,item):temp=Node(item)temp.setNext(self.head)self.head=temp

由于头节点是唯一指向列表节点的外部引用,因此,如果颠倒第3行和第4行的顺序,所有的已有节点都将丢失并且无法访问

接下来要实现的方法——length、search以及remove——都基于链表遍历这个技术。遍历是指系统地访问每一个节点,具体做法是用一个外部引用从列表的头节点开始访问。随着访问每一个节点,我们将这个外部引用通过“遍历”下一个引用来指向下一个节点。

length方法:

def length(self):current=self.headcount=0while current!=None:count=count+1current=current.getNext()return count

search方法:

def search(self,item):current=self.headfound=Falsewhile current!=None and not found:if current.getData()==item:found=Trueelse:current=current.getNext()return found

remove方法:

def remove(self,item):current=self.headprevious=Nonefound=Falsewhile not found:if current.getData()==item:found=Trueelse:previous=currentcurrent=current.getNext()if previous==None:self.head=current.getNext()else:previous.setNext(current.getNext())

三、有序列表抽象数据类型

在有序列表中,元素的相对位置取决于它们的基本特征。它们通常以升序或者降序排列,并且我们假设元素之间能进行有意义的比较。有序列表的众多操作与无序列表的相同。

  • OrderedList()创建一个空的有序列表。它不需要参数,且会返回一个空列表。
  • add(item)假设item之前不在列表中,并向其中添加item,同时保持整个列表的顺序。它接受一个元素作为参数,无返回值。
  • remove(item)假设item已经在列表中,并从其中移除item。它接受一个元素作为参数,并且修改列表。
  • search(item)假设item已经在列表中,并从其中移除item。它接受一个元素作为参数,并且修改列表。
  • search(item)在列表中搜索item。它接受一个元素作为参数,并且返回布尔值。
  • isEmpty()检查列表是否为空。它不需要参数,并且会返回布尔值。
  • length()返回列表中元素的个数。它不需要参数,并且返回一个整数。
  • index(item)假设item已经在列表中国,并返回该元素在列表中的位置。它接受一个元素作为i参数,并返回该元素的下标。
  • pop()假设列表不为空,并移除列表中的最后一个元素。它不需要参数,且会返回一个元素。
  • pop(pos)假设在指定位置pos存在元素,并移除该位置上的元素。它接受位置参数,且会返回一个元素。

四、实现有序列表

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.getData()==item:found=Trueelse:if current.getData()>item:stop=Trueelse:current=current.getNext()return founddef add(self,item):current=self.headprevious=Nonestop=Falsewhile current!=None and not stop:if current.getData()>item:stop=Trueelse:previous=currentcurrent=current.getNext()temp=Node(item)if previous==None:temp.setNext(self.head)self.head=tempelse:temp.setNext(current)previous.setNext(temp)

因为isEmpty和length仅与列表中的节点数目有关,而与实际的元素值无关,所以这两个方法在有序列表中的实现与在无序列表中一样。同理,由于仍然需要找到目标元素并且通过更改链接来移除节点,因此remove方法的实现也一样。剩下的两个方法,search和add,需要做一些修改。

相关文章:

数据结构 | 线性数据结构——列表

目录 一、无序列表抽象数据类型 二、实现无序列表:链表 2.1 Node类 2.2 UnorderedList类 三、有序列表抽象数据类型 四、实现有序列表 列表是元素的集合,其中每一个元素都有一个相对于其他元素的位置。更具体地说,这种列表成为无序列表…...

【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】

文章目录 BIC 指令ORR 位或指令EOR 异或指令 上篇文章:ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr 下篇文章:ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令 BIC 指令 指令格式 bic{条件}{S} Rd,Rn,operan…...

在CSDN学Golang场景化解决方案(EFK分布式日志系统方案)

一,ElasticSearch 分布式集群部署 在 Golang EFK 分布式日志系统方案中,ElasticSearch 是一个分布式搜索引擎和数据存储库,它可以用于存储和搜索大量的日志数据。以下是 ElasticSearch 分布式集群部署的步骤: 下载 ElasticSearc…...

MySQL篇

文章目录 一、MySQL-优化1、在MySQL中,如何定位慢查询?2、SQL语句执行很慢, 如何分析呢?3、了解过索引吗?(什么是索引)4、索引的底层数据结构了解过嘛 ?5、什么是聚簇索引什么是非聚簇索引 ?6、知道什么是回表查询嘛…...

图数据库Neo4j学习四——Spring Data NEO

1配置 1.1Maven依赖 <!--neo4j --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency>1.2yml配置 spring:data:neo4j:uri: bolt://localhost:76…...

UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号

版本 5.2.1 裁剪 - 剪切 - 剪切到边界 裁剪 - 高级 - 溢出策略 - 省略...

Spring Boot实践五 --异步任务线程池

一、使用Async实现异步调用 在Spring Boot中&#xff0c;我们只需要通过使用Async注解就能简单的将原来的同步函数变为异步函数&#xff0c;Task类实现如下&#xff1a; package com.example.demospringboot;import lombok.extern.slf4j.Slf4j; import org.springframework.s…...

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在声明的时候&#xff0c;必须指定数组的…...

【ASPICE】:学习记录

学习记录 ASPICE中文资料什么是ASPICE过程参考模型 ASPICE全称“Automotive Software Process Improvement and Capability dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架 ASPICE中文资料 主要资料来源 什么是ASPICE 过程参考模型...

图论--最短路问题

图论–最短路问题 邻接表 /* e[idx]:存储点的编号 w[idx]:存储边的距离&#xff08;权重&#xff09; */ void add(int a, int b, int c) {e[idx] b;ne[idx] h[a];w[idx] ch[a] idx ; }1.拓扑排序 给定一个 n 个点 m 条边的有向图&#xff0c;点的编号是 11 到 n&#xf…...

go 结构体 - 值类型、引用类型 - 结构体转json类型 - 指针类型的种类 - 结构体方法 - 继承 - 多态(interface接口) - 练习

目录 一、结构体 1、python 与 go面向对象的实现&#xff1a; 2、初用GO中的结构体&#xff1a;&#xff08;实例化一个值类型的数据&#xff08;结构体&#xff09;&#xff09; 输出结果不同的三种方式 3、实例化一个引用类型的数据&#xff08;结构体&#xff09; 4、…...

盘点16个.Net开源项目

今天一起盘点下&#xff0c;16个.Net开源项目&#xff0c;有博客、商城、WPF和WinForm控件、企业框架等。&#xff08;点击标题&#xff0c;查看详情&#xff09; 一、一套包含16个开源WPF组件的套件 项目简介 这是基于WPF开发的&#xff0c;为开发人员提供了一组方便使用自…...

记录对 require.js 的理解

目录 一、使用 require.js 主要是为了解决这两个问题二、require.js 的加载三、main.js 一、使用 require.js 主要是为了解决这两个问题 实现 js 文件的异步加载&#xff0c;避免网页失去响应&#xff1b;管理模块之间的依赖性&#xff0c;便于代码的编写和维护。 二、require.…...

minio-分布式文件存储系统

minio-分布式文件存储系统 minio的简介 MinIO基于Apache License v2.0开源协议的对象存储服务&#xff0c;可以做为云存储的解决方案用来保存海量的图片&#xff0c;视频&#xff0c;文档。由于采用Golang实现&#xff0c;服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置…...

Kindling the Darkness: A Practical Low-light Image Enhancer论文阅读笔记

这是ACMMM2019的一篇有监督暗图增强的论文&#xff0c;KinD其网络结构如下图所示&#xff1a; 首先是一个分解网络分解出R和L分量&#xff0c;然后有Restoration-Net和Adjustment-Net分别去对R分量和L分量进一步处理&#xff0c;最终将处理好的R分量和L分量融合回去。这倒是很常…...

AcWing 4575. Bi数和Phi数

文章目录 题意:思路:代码 题意: 就是给你n个数&#xff0c;对于每一个数y你都需要找到一个最小x使得 ϕ ( x ) ≥ y \phi(x) \ge y ϕ(x)≥y&#xff0c;然后再求一个最小平和。 思路: 其实最开始以来的思路就是二分&#xff0c;我先进行线性筛求出每个数的欧拉函数&#xf…...

《Federated Unlearning via Active Forgetting》论文精读

文章目录 1、概述2、方法实验主要贡献框架概述 3、实验结果比较方法实验结果忘却完整性忘却效率模型实用性 4、总结 原文链接&#xff1a; Federated Unlearning via Active Forgetting 1、概述 对机器学习模型隐私的⽇益关注催化了对机器学习的探索&#xff0c;即消除训练数…...

Java课题笔记~Maven基础知识

一、什么是Maven&#xff1f; Maven是专门用于管理和构建Java项目的工具。 它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布……&#xff09;提供了一套依赖管理机制 …...

xcode中如何显示文件后缀

xcode14.3 用不惯mac电脑真恶心&#xff0c;改个显示文件后缀找半天 1、首先双击打开xcode软件 2、此时&#xff0c;电脑左上角出现xcode字样(左上角如果看不到xcode字样&#xff0c;再次点击xcode软件弹出来就有了)&#xff0c;鼠标右键它&#xff0c;点击setting或者Prefere…...

SpringBoot使用JKS或PKCS12证书实现https

SpringBoot使用JKS或PKCS12证书实现https 生成JKS类型的证书 可以利用jdk自带的keytool工具来生成证书文件&#xff0c; 默认生成的是JKS证书 cmd命令如下: 执行如下命令&#xff0c;并按提示填写证书内容&#xff0c;最后会生成server.keystore文件 keytool -genkey tomcat…...

2026年GPT-5.5实测:Bug检测与代码审查能力能否替代人工Review

研发团队日常代码Review耗时久、漏检率高&#xff0c;新人审查经验不足、资深人力成本昂贵。库拉AI聚合平台支持国内外主流AI模型统一对接、国内可直连访问&#xff0c;每天为注册用户提供可用额度&#xff0c;本文依托该平台完成GPT-5.5代码审查全场景实测&#xff0c;客观验证…...

基于DeepSeek模型的IP文案自动化生成工作流设计与实现

基于DeepSeek模型的IP文案自动化生成工作流设计与实现 1. 项目背景与目标 在数字化营销和品牌建设过程中,IP(Intellectual Property,知识产权/品牌形象)文案扮演着至关重要的角色。高质量的IP文案能够有效传递品牌价值、塑造用户认知、提升转化率。传统的文案撰写依赖人工…...

UE5 GAS修改Attribute的四种正确方式与原理

1. 为什么改Attribute不是简单赋值&#xff0c;而是要走GAS的整套流程 在UE5中用Gameplay Ability System&#xff08;GAS&#xff09;做RPG&#xff0c;很多人刚上手时都会卡在一个看似最基础的问题上&#xff1a; “我想让角色血量100&#xff0c;直接写 Attributes.Health…...

《QGIS空间数据处理与高级制图》022:融合后拓扑错误预检查

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

汽车级MCU MSPM0G3505-Q1实战:从Cortex-M0+内核到CAN-FD与低功耗设计全解析

1. 从数据手册到实战&#xff1a;深度拆解MSPM0G3505-Q1这颗汽车级MCU最近在为一个车载传感节点做选型&#xff0c;要求很明确&#xff1a;成本敏感、功耗要低、模拟性能要强&#xff0c;还得过车规。翻了一圈&#xff0c;TI的MSPM0G3505-Q1进入了视线。说实话&#xff0c;第一…...

专业的郑州苹果手机维修联系电话口碑佳的

在当今数字化时代&#xff0c;苹果手机已成为人们生活中不可或缺的一部分。然而&#xff0c;手机使用过程中难免会出现各种故障&#xff0c;这时候选择一家专业靠谱的维修店就显得尤为重要。在郑州&#xff0c;果速修凭借其卓越的服务和良好的口碑&#xff0c;成为众多苹果用户…...

如何永久保存微信聊天记录?5分钟掌握免费开源工具WeChatMsg

如何永久保存微信聊天记录&#xff1f;5分钟掌握免费开源工具WeChatMsg 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/…...

从FAST到GAMPII:一份给GNSS新手的PPP数据下载与预处理避坑指南

从FAST到GAMPII&#xff1a;GNSS数据预处理全流程实战指南 1. 精密单点定位的数据基石 当你第一次打开GAMP软件准备进行北斗系统的精密单点定位分析时&#xff0c;是否曾被各种数据文件搞得晕头转向&#xff1f;观测文件(o)、导航文件(n/p)、差分码偏差(DCB)文件&#xff0c;…...

【DeepSeek事实准确性测试权威报告】:2024年7大维度实测数据揭穿幻觉率真相

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek事实准确性测试权威报告总览 本报告基于2024年Q3由AI Safety Benchmark Consortium&#xff08;ASBC&#xff09;主导的跨模型事实一致性评估项目&#xff0c;对DeepSeek-V2、DeepSeek-Coder-3…...

<el-button type=“primary“><el-icon><Plus /></el-icon> 上传照片</el-button>的庖丁解牛

它的本质是&#xff1a;**这行代码不仅仅是一个按钮&#xff0c;它是一个 复合交互单元 (Composite Interaction Unit)。它通过 语义化标签 (el-button)、视觉信号 (type"primary", Plus Icon) 和 文本提示 (“上传照片”) 的组合&#xff0c;向用户传达了一个明确的…...