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

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,一经查实,立即删除!

相关文章

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

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

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

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;是分…

【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提交便成功了

springboot个人证书管理系统-计算机毕业设计源码16679

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足&#xff0c;创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…

豪掷5400亿,SK海力士加码部署AI赛道

KlipC报道&#xff1a;最新数据显示&#xff0c;韩国6月半导体出口额达到134亿美元&#xff08;约合人民币973亿元&#xff09;&#xff0c;同比增长50.9%。 KlipC分析师表示&#xff0c;这一数据超出市场预期&#xff0c;对于全球半导体产业链来说&#xff0c;是一则利好的消…

2024年【四川省安全员A证】试题及解析及四川省安全员A证模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员A证试题及解析根据新四川省安全员A证考试大纲要求&#xff0c;安全生产模拟考试一点通将四川省安全员A证模拟考试试题进行汇编&#xff0c;组成一套四川省安全员A证全真模拟考试试题&#xff0c;学员可通…

前后端数据交互流程

一、前言 用户在浏览器访问一个网站时&#xff0c;会有前后端数据交互的过程&#xff0c;前后端数据交互也有几种的情况&#xff0c;一下就简单的来说明一下 二、原理 介绍前后端交互前先来了解一下浏览器的功能&#xff0c;浏览器通过渲染引擎和 JavaScript 引擎协同工作&am…

简明万年历编制(C语言)

简明万年历编制&#xff08;C语言 &#xff09; 编制万年历的要素&#xff1a; 农历公历对照&#xff0c;显示星期&#xff0c;农历干支年&#xff0c;当年生肖&#xff0c;国定节假日&#xff0c;寒天九九&#xff0c;暑日三伏&#xff0c;入梅出梅&#xff0c;节气时间&#…

剑神诀_单机架设_无需虚拟机_小白专用

前言 今天给大家带来一款单机游戏的架设&#xff1a;剑神诀&#xff0c;一键端 无需虚拟机 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 剑神诀 搭建教程 此游戏架设不需要安装虚拟机&#xff0c;…