leetcode设计循环队列(链表方式来实现)

上次我们那个设计循环队列的时候用的是数组,因为那个时候还是不太会链表,现在有了链表的思路,我们一起来看看解题步骤吧。
https://leetcode.cn/problems/design-circular-queue/description/
设计循环队列

那我们其实最主要的就是我们这个队列怎么定义,他的定义方式其实是和顺序表一样的,给一个capacity,但是我们这里实现的方式是链表,我们插入的时候就是malloc一个节点,但是我们这里其实表面上看起来是循环队列,其实是下面这个图,我们这里假设k是四个节点。

这个是满的时候,但是我们这里满用的不是我们下面的节点是不是head,而是size == capacity就行了,所以我们这里的判空和判断有没有满是很简单的。我们可以来看看接口函数和结构体是怎么定义的。

我们这里就好像把顺序表的优点和链表的链式结构合在一起进行使用。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->size == 0;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->size == obj->capacity;
}
判空和判断是不是满的时候就是要比数组的方式简单,而且一开始的时候我想的是先搞出一个循环链表,然后进行尝试,但是给我的结果就是很难取判断什么时候是满的,什么时候是空的,还有head和tail的指向也不是很好的解决。

可以看到这样的方式很难,哪怕是找到问题在那,小编因为实力不行还是不知道怎么改,还是看了leetcode的解题才有思路。
那后面的插入就和链表的尾插是很相似的,所有我这里就不过多的讲解。

这里需要注意的就是第一次的插入,我们因为没有哨兵位的头节点,所有要先来判断一下,否则就是对空指针的访问了。

删除也更简单,只要移动head就可以了,而且我们可以看这种情况就是我们插入插满之后,删掉之后head最后还是变成空,然后在进行插入的时候就协接上了,所以这个方法很好,那完整的代码就放在下面了。
typedef struct newnode
{struct newnode* next;int val;
}Node;typedef struct {int size;int capacity;Node* head;Node* tail;} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->size = obj->capacity = 0;obj->capacity = k;obj->head = obj->tail = NULL;return obj;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->size == 0;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return obj->size == obj->capacity;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(!myCircularQueueIsFull(obj)){Node* newnode = (Node*)malloc(sizeof(Node));newnode->next = NULL;newnode->val = value;if(obj->head == NULL){obj->tail = obj->head = newnode;}else{obj->tail->next = newnode;obj->tail = newnode;}obj->size++;return true;}return false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){obj->head = obj->head->next;obj->size--;return true;}return false;
}int myCircularQueueFront(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){return obj->head->val;}return -1;
}int myCircularQueueRear(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){return obj->tail->val;}return -1;
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj);
}/*** Your MyCircularQueue struct will be instantiated and called as such:* MyCircularQueue* obj = myCircularQueueCreate(k);* bool param_1 = myCircularQueueEnQueue(obj, value);* bool param_2 = myCircularQueueDeQueue(obj);* int param_3 = myCircularQueueFront(obj);* int param_4 = myCircularQueueRear(obj);* bool param_5 = myCircularQueueIsEmpty(obj);* bool param_6 = myCircularQueueIsFull(obj);* myCircularQueueFree(obj);
*/

相关文章:
leetcode设计循环队列(链表方式来实现)
上次我们那个设计循环队列的时候用的是数组,因为那个时候还是不太会链表,现在有了链表的思路,我们一起来看看解题步骤吧。 https://leetcode.cn/problems/design-circular-queue/description/ 设计循环队列 那我们其实最主要的就是我们这个…...
什么是高级语言、机器语言、汇编语言?什么是编译和解释?
1、高级语言 计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种,例如 C、C、Java、Python 等。这些语言被称为高级语言,因为它们更接近人类的自然语言,而不是计算机能够直接…...
简要介绍Spring原生框架与Spring是轻量级框架的原因
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
成为AI产品经理——AI产品经理工作全流程
目录 一、业务背景 二、产品工作流程 1.需求定义 2.技术预研 3.数据准备 4.模型构建、宣讲和验收 5.工程开发及产品上线运营 一、业务背景 背景:排球日常训练活动、排球中考项目和排球体测项目耗费了大量人力成本和时间成本。 目标:开发一套用…...
git commit 撤销的三种方法
一般在提交代码的时候,顺序是这样的 git status // 查看修改文件状态(已添加至暂存区还是未添加至暂存区)git add . // 添加所有已修改文件 git add xxx/xxx // 添加目录为xxx/xxx的文件至暂存区git commit -m xx功能全部完成 // 提交暂存区…...
Linux系统编程 day06 进程间通信
进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下,进程地址空间是相互独立的,每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容,要进行数据交换必…...
血的教训--redis被入侵之漏洞利用复现--总览
血的教训–redis被入侵之漏洞利用复现–总览 相信大家对于自己的服务器被入侵,还是比较憎恨的,我的就被攻击了一次,总结经验,自己也是整理了这一个系列,从最基础到最后面的自己总结被攻破的步骤,非常清晰的…...
C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)
题目描述 计算两个矩阵A和B的乘积。 输入第一行三个正整数m、p和n,0<m,n,p<10,表示矩阵A是m行p列,矩阵B是p行n列;接下来的m行是矩阵A的内容,每行p个整数,用空格隔开;最后的p行是矩阵B的内…...
用windows自带的FTP服务器实现同一局域网建立ftp服务器实现文件共享的详细步骤
原理 Windows自带的FTP服务器是Internet Information Services(IIS)组件的一部分,可以用于同一局域网建立FTP服务器以实现文件共享。下面是使用Windows自带的FTP服务器实现文件共享的详细步骤: 安装IIS组件: 打开控制…...
SpringBoot——模板引擎及原理
优质博文:IT-BLOG-CN 一、模板引擎的思想 模板是为了将显示与数据分离,模板技术多种多样,但其本质都是将模板文件和数据通过模板引擎生成最终的HTML代码。 二、SpringBoot模板引擎 SpringBoot推荐的模板引擎是Thymeleaf语法简单࿰…...
java开发中各个环境的适用场景
java开发中各个环境的适用场景 一.开发环境 在系统开发的经典模型,一般会分成 2 类 5 种环境: 【线下】本地环境(local)、开发环境(dev)、测试环境(test) 【线上】预发布环境(stage)、生产环境(prod) 每个环境、每个项目使用独立的二级域名 线下、线…...
【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(二):面向对象思想
关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第二部分:面向对象思想,子节点表示追问或同级提问 面向对象基…...
Redis 反序列化失败
文章目录 问题原序列化配置修改配置解决方法 问题 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of org.springframework.security.core.authority.SimpleGrantedAuthority (although at least one Creator exists): cannot deser…...
uniapp 导航分类
商品分类数据,包括分类名称和对应的商品列表点击弹出 列表的内容 展示效果如下: 代码展示 ①div部分 <view class"container"><view class"menu-bar"><view class"menu"><view class"menu-sc…...
Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题
文章目录 引言第一部分:复制当前行数据功能的实现1.1 环境准备1.2 创建表格并渲染数据1.3 解决复制的数据不更新问题 第二部分:拓展知识2.1 Vue的响应性原理2.2 Element UI的更多用法 结语 Vue Element UI 实现复制当前行数据功能及解决复制到新增页面组…...
智慧化工~工厂设备检修和保全信息化智能化机制流程
化工厂每年需要现场检修很多机器,比如泵、压缩机、管道、塔等等,现场检查人员都是使用照相机,现场拍完很多机器后,回办公室整理乱糟糟的照片,但是经常照了之后无法分辨是哪台设备,而且现场经常漏拍…...
【LeetCode热题100】【哈希】字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", …...
基于C#实现Bitmap算法
在所有具有性能优化的数据结构中,我想大家使用最多的就是 hash 表,是的,在具有定位查找上具有 O(1)的常量时间,多么的简洁优美,但是在特定的场合下: ①:对 10 亿个不重复的整数进行排序。 ②&am…...
科学与工程计算基础(数值计算)知识点总结
数值计算 第1章 概论1.2 数值计算中的误差1.2.1 误差的来源和分类1.2.2 误差与有效数字1.2.3 数值运算的误差估计 1.3 误差定性分析和避免误差危害1.3.1 算法的数值稳定性1.3.3 避免误差危害 1.4 数值计算中算法设计的技术1.5 习题1.5.1 判断题1.5.2 计算题 第2章 插值法2.2 拉…...
oracle查询开始时间和结束时间之间的连续月份
SELECT TO_CHAR(ADD_MONTHS(TO_DATE(2023-01,YYYY-MM), ROWNUM - 1), YYYY-MM) AS fmonth FROM DUALCONNECT BY ROWNUM < CEIL(MONTHS_BETWEEN(TO_DATE(2023-11, YYYY-MM), TO_DATE(2023-01,YYYY-MM))1)...
Freertos堆管理算法解析:如何为STM32选择最优内存方案
FreeRTOS堆管理算法深度解析:STM32工业控制项目中的内存优化实践 在工业控制领域,实时性和可靠性是系统设计的核心诉求。STM32系列微控制器凭借其优异的性能价格比,成为众多工业设备的首选平台。而FreeRTOS作为一款轻量级实时操作系统&#x…...
Redis:延迟双删的适用边界与落地细节弦
pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...
SetDPI终极指南:如何精准控制Windows多显示器DPI缩放,告别模糊显示
SetDPI终极指南:如何精准控制Windows多显示器DPI缩放,告别模糊显示 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 你是否厌倦了Windows系统粗糙的DPI缩放设置?当你在4K显示器上享受清晰文字时&#x…...
上班族也能用的PTrade量化策略:沪深300增强版保姆级配置指南
上班族量化投资实战:PTrade沪深300增强策略全流程配置手册 每天早上9点挤地铁时刷财经新闻,总能看到沪深300指数又创新高的消息,心里盘算着"要是早点入场就好了"。但作为朝九晚六的上班族,既没时间盯盘,又怕…...
ROS2新手必看:rqt图形化工具从安装到实战(附小乌龟控制技巧)
ROS2图形化利器:rqt工具从零精通到多海龟协同控制实战 第一次接触ROS2时,命令行操作总让人望而生畏。记得我刚开始调试机器人时,在终端里反复输入ros2 topic list和ros2 service call的场景至今难忘——直到发现了rqt这个可视化神器。作为ROS…...
物联网平台层避坑指南:华为云IoT vs 阿里云物联网平台功能对比(2024新版)
华为云IoT与阿里云物联网平台深度对比:2024企业选型实战指南 当企业决定将业务迁移到物联网平台时,技术选型往往成为第一个关键决策点。作为国内市场份额最高的两大平台,华为云IoT和阿里云物联网平台各自拥有独特的优势与适用场景。但在实际商…...
SEATA分布式事务——AT模式烂
简介 AI Agent 不仅仅是一个能聊天的机器人(如普通的 ChatGPT),而是一个能够感知环境、进行推理、自主决策并调用工具来完成特定任务的智能系统,更够完成更为复杂的AI场景需求。 AI Agent 功能 根据查阅的资料,agent的…...
Bytenode加载器文件原理:深入理解CommonJS与ES模块的差异
Bytenode加载器文件原理:深入理解CommonJS与ES模块的差异 【免费下载链接】bytenode A minimalist bytecode compiler for Node.js 项目地址: https://gitcode.com/gh_mirrors/by/bytenode Bytenode作为一款轻量级的Node.js字节码编译器,通过将Ja…...
告别裸机轮询:用STM32串口中断+DMA实现高效数据收发(附F103/F4代码对比)
STM32串口通信进阶:中断与DMA的高效实战指南 在嵌入式开发中,串口通信如同系统的神经末梢,承担着设备间数据交换的重任。当项目从简单的调试打印升级到高速数据流处理时,传统的轮询方式往往显得力不从心。本文将带您深入STM32的US…...
Qwen3智能字幕系统部署案例:中小企业视频号运营字幕自动化方案
Qwen3智能字幕系统部署案例:中小企业视频号运营字幕自动化方案 1. 引言:视频运营的字幕痛点与解决方案 在短视频内容爆发的时代,中小企业视频号运营面临一个共同难题:字幕制作。传统手动添加字幕的方式不仅耗时耗力,…...
