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

leetcode 622. 设计循环链表

这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助

(最好在VS自己测试一遍,再放到 leetcode上哦)

下面的是主函数(作参考),静下心来慢慢测试


 622. 设计循环链表

题目

设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。

你的实现应该支持如下操作:

  • MyCircularQueue(k): 构造器,设置队列长度为 k 。
  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

题目链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文字 和 画图 分析

  1. 思考什么情况下,队列为空,队列为满

定义一个 指针head,用来存放头节点的地址,和一个指针tail,用来存放尾节点的地址(这个思路和队列的实现是一样的)

按照正常思路,大多数人会以为(队列长度为k):

当 head = tail 为空,而 tail 是第 k 个节点的时候为满,却忽略一点,这是个循环链表

以下这种情况就不成立:

通过图我们知道 head = tail 无法判断是空还是满

所以我们换一种思路:

存放 k 个元素,但是开辟(k + 1)个节点,故意留下一个节点不放元素

情况就是这样的:

我们发现:

当 head = tail 为空;

当 tail 的下一个节点 = head为满;

    2.  选用数组还是链表去做

这里两者思路我都讲(代码仅供参考,能通过,但是我个人觉得有些地方没有处理好,其实可以更完善,听思路即可)

  • 用数组(head 和 tail 就是元素下标)

a. 首先明确这本质是一个循环链表

b. 实现过程可能会遇到的问题:

问题1:

这里可以看到 tail 不可能一直加加

如果是正确的思路,此时的图应该是这样:

所以我们这里要对 tail 进行处理:

这里可以通用

tail = tail % (k + 1)(head也会出现这样的情况,同样要这么处理)

问题2:

判断为满时,我们可能会犯错误

这种情况我们非常容易知道:判断

tail + 1 == head

但是这种情况就不适用了:

所以我们要写一个通式:

(tail + 1 ) % (k + 1) == head

问题3:

找到尾元素

正常情况下的尾元素很好找

尾元素的下标就是 tail - 1

如果是这样,就不好判断了

这里我们可以用 if ,else语句做区分,

也可以写一个通式:

(tail - 1 + k + 1) % (k + 1)

即:(tail + k )%(k + 1)

  • 用链表(head 和 tail 就是头节点和 尾节点的地址)

a. 这里可以写一个循环链表

可以在初始化的时候先搭建好这个循环链表,后面再存放元素

b. 只有一个地方需要注意:

就是找尾元素(实际上,应该是tail的上一个节点)

这里选择可以记录上一个节点的地址

或者 循环找到上一个节点


代码

代码1:

typedef int SLType;
typedef struct StackList
{SLType* a;int top;int rear;int k;
}SL;//创建数组
void SLInit(SL* head, int k)
{assert(head);head->a = (SLType*)malloc((k + 1) * sizeof(SLType));head->top = 0;head->rear = 0;head->k = k;
}//初始化数组
void SLPush(SL* head, SLType x)
{assert(head);head->a[head->rear] = x;head->rear++;
}//存放元素
void SLPop(SL* head)
{assert(head);head->top++;
}//删除元素//以上都是数组的实现typedef struct
{SL q;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));SLInit(&obj->q, k);return obj;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{SL* q1 = &obj->q;return  q1->rear == q1->top;
}//判断是否为空bool myCircularQueueIsFull(MyCircularQueue* obj)
{SL* q1 = &obj->q;int a = q1->rear;a = (q1->rear + 1) % (q1->k + 1);return a  == q1->top;
}//判断是否为满bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{if (myCircularQueueIsFull(obj)){return false;}else{SLPush(&obj->q, value);SL* q1 = &obj->q;q1->rear = q1->rear % (q1->k + 1);return true;}}//存放元素bool myCircularQueueDeQueue(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return false;}else{SLPop(&obj->q);SL* q1 = &obj->q;q1->top = q1->top % (q1->k + 1);return true;}}//删除元素int myCircularQueueFront(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return -1;}else{return (&obj->q)->a[(&obj->q)->top];}
}//返回头元素int myCircularQueueRear(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return -1;}else{if ((&obj->q)->rear == 0){return (&obj->q)->a[(&obj->q)->k];} return(&obj->q)->a[(&obj->q)->rear - 1];}
}//返回尾元素void myCircularQueueFree(MyCircularQueue* obj)
{free(obj);
}//销毁空间

 代码2:

typedef int QLType;
typedef struct QueueNode
{QLType val;struct QueueNode* next;
}QN;//创建节点
typedef struct StackList
{QN* head;QN* tail;}QL;//创建队列
void  QNInit(QL* pphead, int k)
{pphead->head = pphead->tail = NULL;QN* prev = NULL;k = k + 1;while (k--){QN* newnode = (QN*)malloc(sizeof(QN));if (pphead->head == NULL){prev =  pphead->head = pphead->tail = newnode;}else{pphead->tail = newnode;pphead->head->next = pphead->tail;pphead->tail->next = prev;pphead->head = pphead->tail;}}pphead->head =pphead->tail = prev;
}//初始化并链接节点QLType QLTop(QL* pphead)
{return pphead->head->val;
}//返回首元素
QLType QLtail(QL* pphead)
{QN* rear = pphead->head;while (rear->next != pphead->tail){rear = rear->next;}return rear->val;
}//返回尾元素
void QLpush(QL* pphead, int val)
{pphead->tail->val = val;pphead->tail = pphead->tail->next;
}//存放元素
void QLPop(QL* pphead)
{pphead->head = pphead->head->next;
}//删除元素//以上是链表的创建typedef struct
{QL q;
} MyCircularQueue;MyCircularQueue * myCircularQueueCreate(int k)
{MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));QNInit(&obj->q, k);return obj;
}//初始化
bool myCircularQueueIsEmpty(MyCircularQueue* obj)
{QL* q1 = &obj->q;return  q1->head == q1->tail;
}//判断是否为空bool myCircularQueueIsFull(MyCircularQueue* obj)
{QL* q1 = &obj->q;return q1->tail->next == q1->head;
}//判断是否为满
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value)
{if (myCircularQueueIsFull(obj)){return false;}else{QLpush(&obj->q, value);return true;}}//存放元素bool myCircularQueueDeQueue(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return false;}else{QLPop(&obj->q);return true;}
}//删除元素int myCircularQueueFront(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return -1;}else{return QLTop(&obj->q);}
}//返回首元素int myCircularQueueRear(MyCircularQueue* obj)
{if (myCircularQueueIsEmpty(obj)){return -1;}else{return  QLtail(&obj->q);}
}//返回尾元素void myCircularQueueFree(MyCircularQueue* obj)
{free(obj);
}//释放空间

相关文章:

leetcode 622. 设计循环链表

这道题讲了两种方法,第一个代码是用数组实现的,第二个是用链表实现的,希望对你们有帮助 (最好在VS自己测试一遍,再放到 leetcode上哦) 下面的是主函数(作参考),静下心来…...

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件,tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…...

Linux 基础IO

文章目录 前言基础IO定义系统IO接口文件描述符重定向原理缓冲区刷新 前言 要知道每个函数/接口的全部参数和返回值建议去官网或者直接在Linux的man手册中查,这不是复制粘贴函数用法的文章。 C语言文件读写介绍链接 基础IO定义 IO是Input/Output的缩写&#xff0c…...

uniapp 打开文件管理器上传(H5、微信小程序、android app三端)文件

H5跟安卓APP 手机打开的效果图&#xff1a; Vue页面&#xff1a; <template><view class"content"><button click"uploadFiles">点击上传</button></view> </template><script>export default {data() {return…...

掌控安全 -- header注入

http header注入 该注入是指利用后端验证客户端口信息&#xff08;比如常用的cookie验证&#xff09;或者通过http header中获取客户端的一些信息&#xff08;比如useragent用户代理等其他http header字段信息&#xff09;&#xff0c;因为这些信息是会重新返回拼接到后台中的&…...

windows批处理脚本(.bat)如何激活Anconda Prompt虚拟环境

通过call 来调用激活脚本&#xff0c; activate myenv指的是要激活的环境&#xff0c;若省略&#xff0c;则激活的是base环境。 call : 从另一个批处理程序调用一个批处理程序&#xff0c;而不停止父批处理程序。 call C:\ProgramData\Anaconda3\Scripts\activate.bat activate…...

扩散模型实战(十四):扩散模型生成音频

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…...

《微信小程序开发从入门到实战》学习四十七

4.4 云函数 4.4.5 云函数的定时触发 如果云函数需要定时执行&#xff0c;可以使用云函数定时触发器。配置了定时触发器&#xff0c;云函数会在相应时间点被自动触发。函数返回结果不会返回调用方 在需要添加触发器的云函数下新建文件config.json。格式如下&#xff1a; &quo…...

LeetCode刷题笔记之数组

一、二分查找 1. 704【二分查找】 题目&#xff1a; 给定一个 n 个元素 有序的&#xff08;升序&#xff09; 整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。代码&#xff1a;…...

ViT:视觉 Transformer

ViT&#xff1a;视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势&#xff1a;注意力机制相当于一个多标签检索系统&#xff0c;位置嵌入能知道每个单词的位置&#xff0c;而且适合并行。 尝试把 Transformer 迁移到视觉领…...

Jmeter 请求签名api接口-BeanShell

Jmeter 请求签名api接口-BeanShell 项目签名说明编译扩展jar包jmeter 使用 BeanShell 调用jar包中的签名方法 项目签名说明 有签名算法的api接口本地不好测试&#xff0c;使用BeanShell 扩展jar 包对参数进行签名&#xff0c;接口签名算法使用 sha512Hex 算法。签名的说明如下…...

No suitable driver found for jdbc:mysql://localhost:3306(2023/12/7更新)

有两种情况&#xff1a; 压根没安装下载了但没设为库或方法不对 大多数为第一种情况&#xff1a; 一. 下载jdbc 打开网址选择一个版本进行下载 https://nowjava.com/jar/version/mysql/mysql-connector-java.html 二.安装jdbc 在项目里建一个lib文件夹 在把之前下载的jar文…...

word文档中数字格式转换(排版助手)

示例&#xff1a;李老师收入了234243.33元&#xff0c;产量3000公斤&#xff1b; 张老师收入了2324324元&#xff0c;产量45555公斤&#xff1b; 孙老师收入了600000元&#xff0c;产量2342公斤 王老师收入了1234443243元&#xff0c;产量1243142公斤。 1、数字批量转换成千…...

阿里云docker加速

文章目录 一、 阿里云镜像仓库配置二、配置加速1. CentOS2. Mac3. Windows注意 一、 阿里云镜像仓库配置 1.注册阿里云账号&#xff0c;并登陆到阿里云后台&#xff0c;进入控制台面板 2.进入控制台以后&#xff0c;找到左上方的三横的功能列表按钮&#xff0c;在弹出来的功能…...

Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现

0x01 产品简介 Panalog大数据日志审计系统定位于将大数据产品应用于高校、 公安、 政企、 医疗、 金融、 能源等行业之中&#xff0c;针对网络流量的信息进行日志留存&#xff0c;可对用户上网行为进行审计&#xff0c;逐渐形成大数据采集、 大数据分析、 大数据整合的工作模式…...

openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复

文章目录 openGauss学习笔记-152 openGauss 数据库运维-备份与恢复-物理备份与恢复之PITR恢复152.1 背景信息152.2 前提条件152.3 PITR恢复流程152.4 recovery.conf文件配置**152.4.1 归档恢复配置****152.4.2 恢复目标设置** openGauss学习笔记-152 openGauss 数据库运维-备份…...

PhpStorm基本配置及常用快捷键

重要Preference配置 激活服务器 http://jetbrains.tencent.click/http://owo.helphttp://idea.imsxm.com/http://www.0-php.com:10172017.3以上版本 JetBrains IDE 2017.3以上版本&#xff0c;激活检测机制变成了动态封禁域名&#xff0c;导致大部分域名激活被屏蔽了&#xff0…...

Autosar通信实战系列05-CanNM模块进阶常见问题思考

本文框架 前言1. UDS 0x28服务控制Nm报文收发后对状态机有影响?2. 节点网络启动后第一帧是否必须是网络管理报文?3. 主动唤醒后发送的第一帧报文为NM报文如何配置?4. CanNmMsgCycleOffset的使用场景?5. 什么情况下CBV中RepeatMessageRequest Bit置位?6. 主动(本地)唤醒与…...

Java中多态的一些简单理解

什么是多态 1.面向对象的三大特性&#xff1a;封装、继承、多态。从一定角度来看&#xff0c;封装和继承几乎都是为多态而准备的。这是我们最后一个概念&#xff0c;也是最重要的知识点。 2.多态的定义&#xff1a;指允许不同类的对象对同一消息做出响应。即同一消息可以根据发…...

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…...

案例025:基于微信小程序的移动学习平台的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…...

写实3D游戏模型纹理贴图设置

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xff1a; …...

如何基于Akamai IoT边缘平台打造一个无服务器的位置分享应用

与地理位置有关的应用相信大家都很熟悉了&#xff0c;无论是IM软件里的位置共享或是电商、外卖应用中的配送地址匹配&#xff0c;我们几乎每天都在使用类似的功能与服务。不过你有没有想过&#xff0c;如何在自己开发的应用中嵌入类似的功能&#xff1f; 本文Akamai将为大家提…...

【开源】基于JAVA的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…...

KaiOS 运营商相关文件operator_variant_manager.js代码功能和调试

gaia/apps/system/js/operator_variant_manager.js at master mozilla-b2g/gaia GitHub js文件接口功能 No 接口/常量 功能 1 OperatorVariantManager var OperatorVariantManager function(core) 2 OperatorVariantManager.IMPORTS OperatorVariantManager.I…...

【数据结构(六)】排序算法介绍和算法的复杂度计算(1)

文章目录 1. 排序算法的介绍1.1. 排序的分类 2. 算法的时间复杂度2.1. 度量一个程序(算法)执行时间的两种方法2.2. 时间频度2.2.1. 忽略常数项2.2.2. 忽略低次项2.2.2. 忽略系数 2.3. 时间复杂度2.4. 常见的时间复杂度2.5. 平均时间复杂度和最坏时间复杂度 3. 算法的空间复杂度…...

带有 RaspiCam 的 Raspberry Pi 监控和延时摄影摄像机

一、说明 一段时间以来&#xff0c;我一直想构建一个运动激活且具有延时功能的树莓派相机&#xff0c;但从未真正找到我喜欢的案例。我在thingiverse上找到了这个适合树莓派和相机的好案例。它是为特定的鱼眼相机设计的&#xff0c;但从模型来看&#xff0c;我拥有的廉价中国鱼…...

Apache Doris 在某工商信息商业查询平台的湖仓一体建设实践

作者&#xff5c;某工商信息商业查询平台 高级数据研发工程师 李昂 信息服务行业可以提供多样化、便捷、高效、安全的信息化服务&#xff0c;为个人及商业决策提供了重要支撑与参考。对于行业相关企业来说&#xff0c;数据收集、加工、分析能力的重要性不言而喻。以某工商信息…...

【尘缘送书第六期】2023年度学习:AIGC、AGI、GhatGPT、人工智能大模型实现必读书单

【文末送书】今天推荐几本AIGC、AGI、GhatGPT、人工智能大模型领域优质书籍。 目录 前言1 《ChatGPT 驱动软件开发》2 《ChatGPT原理与实战》3 《神经网络与深度学习》4 《AIGC重塑教育》5 《通用人工智能》6 文末送书 前言 2023年是人工智能大语言模型大爆发的一年&#xff0…...

我的 CSDN 三周年创作纪念日:2020-12-12

本人大叔一枚&#xff0c;自1992年接触电脑&#xff0c;持续了30年的业余电脑发烧爱好者&#xff0c;2022年CSDN博客之星Top58&#xff0c;阿里云社区“乘风者计划”专家博主。自某不知名财校毕业后进入国有大行工作至今&#xff0c;先后任职于某分行信息科技部、电子银行部、金…...