数据结构——带环链表、循环队列问题

1.带环链表问题

1.1给定一个链表判断其是否带环

解决思路:利用快慢指针法,快指针一次走两步慢指针一次走一步,从链表起始位置遍历链表,如果链表带环,则快慢指针一定会在环中相遇,否则快指针先到达链表末尾。

代码实现:(链表的实现请跳转☞http://t.csdnimg.cn/JeNAV)

SLNode* IsLink(SLNode* head)
{SLNode* fast = head;SLNode* slow = head;//让快慢指针先走一步进循环fast = fast->next->next;slow = slow->next;//这里是循环的条件:快慢指针未相遇、快指针未到链表末端while ((fast != slow) && (fast != NULL)){fast = fast->next->next;slow = slow->next;}if (fast == slow){return fast;}if(fast==NULL){return NULL;}
}void test()
{//创建一个带环链表SLNode* Node1 = SLBuyNode(1);SLNode* Node2 = SLBuyNode(2);SLNode* Node3 = SLBuyNode(3);SLNode* Node4 = SLBuyNode(4);SLNode* Node5 = SLBuyNode(5);SLNode* Node6 = SLBuyNode(6);SLNode* Node7 = SLBuyNode(7);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;Node5->next = Node6;Node6->next = Node7;Node7->next = Node4;//判断是否带环,如果带环打印相遇节点,如果不带环打印"NULL"if (IsLink(Node1) == NULL){printf("NULL\n");}else{printf("%d\n", IsLink(Node1)->Data);}}int main()
{test();return 0;
}

1.2给定一个带环链表,返回链表开始入环的第一个节点

解决方案:让一个指针从链表头开始遍历链表,同时另一个指针从判断相遇位置开始绕环运行,两个指针都是一次走一步,最终会在进环的第一个节点相遇

证明:

代码实现:

//判断是否为带环链表
SLNode* IsLink(SLNode* head)
{SLNode* fast = head;SLNode* slow = head;//让快慢指针先走一步进循环fast = fast->next->next;slow = slow->next;//这里是循环的条件:快慢指针未相遇、快指针未到链表末端while ((fast != slow) && (fast != NULL)){fast = fast->next->next;slow = slow->next;}if (fast == slow){return fast;}if(fast==NULL){return NULL;}
}//返回带环链表的进环节点
SLNode* EntryNode(SLNode* head, SLNode* M)
{SLNode* a = head;SLNode* b = M;while (a != b){a = a->next;b = b->next;}return a;
}void test2()
{//创建一个带环链表:1->2->3->4->5->6->7->4->5...SLNode* Node1 = SLBuyNode(1);SLNode* Node2 = SLBuyNode(2);SLNode* Node3 = SLBuyNode(3);SLNode* Node4 = SLBuyNode(4);SLNode* Node5 = SLBuyNode(5);SLNode* Node6 = SLBuyNode(6);SLNode* Node7 = SLBuyNode(7);Node1->next = Node2;Node2->next = Node3;Node3->next = Node4;Node4->next = Node5;Node5->next = Node6;Node6->next = Node7;Node7->next = Node4;//返回进环节点SLNode* M = IsLink(Node1);SLNode* E = EntryNode(Node1, M);printf("%d\n", E->Data);
}int main()
{test2();return 0;
}

 2.循环队列问题

2.1循环队列

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

2.2代码实现:

CircularQueue.h 

#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<math.h>typedef int CQDataType;typedef struct CircularQueue
{CQDataType* a;  //利用数组实现循环链表int head;       //指向头int tail;       //指向尾的下一个
}CQueue;//初始化
void CQInit(CQueue* q);//入队列
void CQPush(CQueue* q, CQDataType x);//出队列
void CQPop(CQueue* q);//查看队头
CQDataType CQTop(CQueue* q);//数据有效个数
size_t CQSize(CQueue* q);//判空
bool CQEmpty(CQueue* q);//判满
bool CQFull(CQueue* q);//销毁
void CQDestroy(CQueue* q);

CircularQueue.c

#include"CircularQueue.h"//初始化
void CQInit(CQueue* q)
{assert(q);//创建一个5+1的数组实现容量为5的循环队列q->a = (CQDataType*)malloc(sizeof(CQDataType)*6);q->head = q->tail = 0;
}//判满
bool CQFull(CQueue* q)
{assert(q);return (q->tail + 1) % 6 == q->head;
}//入队列(入队列前需判断是否满)
void CQPush(CQueue* q, CQDataType x)
{assert(q);//判满if (CQFull(q)){perror("CQFull(q) is full");return;}//第一个数据入队列if (q->head == q->tail == 0){q->a[q->tail] = x;q->tail++;}else{q->a[q->tail] = x;q->tail++;}q->tail = q->tail % 6;
}//判空
bool CQEmpty(CQueue* q)
{assert(q);return q->head == q->tail;
}//出队列(出队列前判空)
void CQPop(CQueue* q)
{assert(q);if (CQEmpty(q)){perror("CQEmpty(q) is true");return;}q->head++;q->head = q->head % 6;
}//查看队头
CQDataType CQTop(CQueue* q)
{assert(q);assert(CQEmpty(q) != true);return q->a[q->head];
}//数据有效个数
size_t CQSize(CQueue* q)
{assert(q);if (q->tail < q->head){return 6 - q->head + q->tail - 0;}return abs(q->tail - q->head);
}//销毁
void CQDestroy(CQueue* q)
{assert(q);free(q->a);q->a = NULL;q->head = q->tail = 0;
}

以上便是本期讨论的两个数据结构问题,欢迎大家评论讨论交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

54、Flink 测试工具测试 Flink 作业详解

测试 Flink 作业 a&#xff09;JUnit 规则 MiniClusterWithClientResource Apache Flink 提供了一个名为 MiniClusterWithClientResource 的 Junit 规则&#xff0c;用于针对本地嵌入式小型集群测试完整的作业。 叫做 MiniClusterWithClientResource. 要使用 MiniClusterWit…

Kafka-服务端-副本同步-源码流程

杂 在0.9.0.0之前&#xff0c;Kafka提供了replica lag.max.messages 来控制follower副本最多落后leader副本的消息数量&#xff0c;follower 相对于leader 落后当超过这个数量的时候就判定该follower是失效的&#xff0c;就会踢出ISR&#xff0c;这里的指的是具体的LEO值。 对…

墨烯的C语言技术栈-C语言基础-001

(最近报名了9月的计算机二级 得好好重温一下C语言 祝我计算机二级必过!) 学习视频为B站的哔哩大学计算机学院 参考书籍为C语言程序设计第五版(张磊主编) 一.什么是C语言C语言是一门通用计算机编程语言 广泛应用底层开发 C语言的设计目标是提供一种能以简易的方式编译 处理低级…

面试历程--工行外包,岗位高级测试工程师

岗位来源&#xff1a;朋友内推 面试形式&#xff1a;线上会议 面试官&#xff1a;开始三人&#xff0c;后续两人 面试历程&#xff1a; 1.自我介绍&#xff1a;老样子&#xff0c;没有突出重点 2.问题&#xff1a; 2.1 自动化测试框架用的什么&#xff1f; 回答springbo…

软考高级之系统分析师及系统架构设计师备考过程记录

0x00 前言 考了两次系分&#xff0c;一次架构&#xff0c;今年系分终于上岸。 在此记录备考过程和一些体会 先说我自己的情况&#xff0c;我本硕都是计算机科班出身&#xff0c;本科的时候搞Java后端开发&#xff0c;硕士搞python和深度学习&#xff0c;但工作之后就基本没碰过…

洞鉴-产品部署及其功能

网络策略&#xff1a;安装&#xff1a; 资源准备 ⼀、系统安装包 https://chaitin-release.oss-cnbeijing.aliyuncs.com/release%2Ff%2F66600aac66bcea13c086319c?Expires1719310707 &OSSAccessKeyIdLTAI5tBpSz7iLYLH51NrVx22&SignaturesOpuVYuKpm9ZBoEzfwiRlJ fLrhQ…

STM32 HAL库读取ID

在stm32f1xx_hal.c文件中由读取ID号的子函数&#xff0c;不同单片机的UID_BASE不同&#xff0c;本单片机用的是STM32F103CBT6,跳转之后可以看到地址为&#xff1a;0x1FFFF7E8 在程序中只需定义一个数组调用读取ID的函数即可 uint32_t UID[3]; while(1) { UID[0] HAL_GetUIDw0…

C盘清理和管理

本篇是C盘一些常用的管理方法&#xff0c;以及定期清理C盘的方法&#xff0c;大部分情况下都能避免C盘爆红。 C盘清理和管理 C盘存储管理查看存储情况清理存储存储感知清理临时文件清理不需要的 迁移存储 磁盘清理桌面存储管理应用存储管理浏览器微信 工具清理 C盘存储管理 查…

VUE3+ AntV Select 选择器:mode=“multiple“和mode=“tags“的区别是什么

文章目录 VUE3 AntV Select 选择器&#xff1a;mode"multiple"和mode"tags"的区别是什么一、解释二、对比演示 VUE3 AntV Select 选择器&#xff1a;mode"multiple"和mode"tags"的区别是什么 一、解释 “mode” 是一个参数&#xff…

SpringSecurity中文文档(Servlet Persisting Authentication)

Persisting Authentication 用户第一次请求受保护的资源时&#xff0c;系统会提示他们输入凭据。提示凭据的最常见方法之一是将用户重定向到登录页。对于请求受保护资源的未经身份验证的用户&#xff0c;总结的 HTTP 交换可能如下所示: Example 1. Unauthenticated User Requ…

VBA字典与数组第十六讲:行、列数不相同的数组间运算规律

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

【SpringCloud】Config源码解析

config是一个微服务配置组件&#xff0c;为微服务提供集中化的配置管理服务。config包含服务端和客户端&#xff0c;客户端在启动服务时从服务端拉取配置信息&#xff0c;服务端响应客户端的请求提供具体的配置。本章分析config组件配置信息的拉取过程 1、config服务端 服务端…

一键AI抠图太方便啦!不会ps也能成为修图大师

引言 在数字生活中&#xff0c;抠图技能已成为一项日常且必不可少的技能。无论是需要更换证件照的背景色&#xff0c;还是想要将图像中的主体精确分离。 但并非所有人都精通Photoshop&#xff0c;而且对于简单的任务来说&#xff0c;使用Photoshop可能显得过于复杂。因此&…

1077 韩信点兵

这是一个中国剩余定理的问题。中国剩余定理是数论中的一个定理&#xff0c;它给出了一组同余方程的解的存在性和唯一性。在这个问题中&#xff0c;我们需要找到一个数&#xff0c;使得它对给定的每个质数取余的结果等于给定的余数。 以下是一个使用C实现的解决方案&#xff1a…

Spark2.0

目录 10.3 Spark运行架构 10.3.1 基本概念 10.3.2 架构设计 ​编辑 10.3.3 Spark运行基本流程 Spark运行架构特点 10.3 Spark运行架构 10.3.1 基本概念 RDD &#xff1a;是 Resillient Distributed Dataset &#xff08;弹性分布式数据集&#xff09;的简称&#xff0c;是分…

elasticsearch入门基本知识+使用案例

1、ES逻辑结构 索引-index&#xff1a;相当于db中的数据库名。索引命名规则&#xff1a;小写字母。 类型-type&#xff1a;相当于数据库中的表名&#xff0c;为具有相同字段的文档定义的一个类型。 字段-field&#xff1a;相当于表字段名&#xff0c;文档数据的属性…

C 标准库 - <stdio.h>

C 标准库 - <stdio.h> 概述 <stdio.h> 是 C 语言标准库中的一个头文件&#xff0c;它包含了用于输入输出操作的函数声明。这些函数主要用于处理文件读写、格式化输出、字符输入输出等操作。stdio.h 是 "standard input/output" 的缩写&#xff0c;它提…

【Llama 2的使用方法】

Llama 2是Meta AI&#xff08;Facebook的母公司Meta的AI部门&#xff09;开发并开源的大型语言模型系列之一。Llama 2是在其前身Llama模型的基础上进行改进和扩展的&#xff0c;旨在提供更强大的自然语言处理能力和更广泛的应用场景。 以下是Llama 2的一些关键特性和更新点&am…

git主机仓库地址迁移后 git提交代码报错

找到本地电脑的文件known_hosts 2.在代码中git pull 此时终端会有提示 输入ye enter提交便成功了

EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式

EasyExcel动态表头多sheet导出,单元格操作样式,自动修改单元格格式 说明 EasyExcel是一款开源的Java库&#xff0c;用于读取、写入和操作Excel文件。它是阿里巴巴集团开发的一款高效、功能丰富且易于使用的Excel操作工具。 EasyExcel提供了简洁的API&#xff0c;使得读写Excel…