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

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);
*/

在这里插入图片描述

相关文章:

  • UDP分片和丢包与TCP效果对比
  • 基于 Gin 的 HTTPS 代理 Demo
  • 【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度
  • Hive内置表生成函数
  • 什么是轻量应用服务器?可以从亚马逊云科技的优势入手了解
  • Unsupervised Skill Discovery via Recurrent Skill Training论文笔记
  • STM32-使用固件库新建工程
  • c 语言线程的使用
  • 【软件测试】“我“做了一年的功能点点点测试,感觉在浪费时间...
  • 肾合胶囊 | 冬不养肾春易病,若出现了这六大表现,小心是肾虚!
  • 使用Python+Redis实现文章投票网站后端功能
  • 机器学习探索计划——KNN算法流程的简易了解
  • 网络篇---第一篇
  • [pyqt5]pyqt5设置窗口背景图片后上面所有图片都会变成和背景图片一样
  • WPF绘图技术介绍
  • ----------
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • ➹使用webpack配置多页面应用(MPA)
  • Android Volley源码解析
  • Babel配置的不完全指南
  • Docker下部署自己的LNMP工作环境
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • Otto开发初探——微服务依赖管理新利器
  • PAT A1017 优先队列
  • Redis字符串类型内部编码剖析
  • socket.io+express实现聊天室的思考(三)
  • SpringBoot 实战 (三) | 配置文件详解
  • 主流的CSS水平和垂直居中技术大全
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • 我们雇佣了一只大猴子...
  • ​iOS安全加固方法及实现
  • $.ajax()
  • $forceUpdate()函数
  • ( 10 )MySQL中的外键
  • (4)logging(日志模块)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (libusb) usb口自动刷新
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (七)理解angular中的module和injector,即依赖注入
  • (十一)c52学习之旅-动态数码管
  • (转)ORM
  • (转)socket Aio demo
  • (转)原始图像数据和PDF中的图像数据
  • (转载)虚函数剖析
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .cn根服务器被攻击之后
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET导入Excel数据
  • .net中调用windows performance记录性能信息
  • /proc/vmstat 详解
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @Autowired多个相同类型bean装配问题