检查链表是否有环,返回值为bool和从头节点进入环的第一个节点两种情况

题目1(不返回节点)

给定单链表,检查链表是否有环。

代码实现:

bool IsCircle(List plist)
{
	assert(plist != NULL);
	if (plist == NULL||plist->next==NULL)
		return false;

	Node* p = plist->next;//慢指针,一次走一步
	Node* q = plist->next->next;//快指针,一次走两步

	while (q!= NULL&&q->next!=NULL)
	{
		if (p == q)
		{
			break;
		}
		else
		{
			p = p->next;
			q = q->next->next;
		}
	}
	if (q == NULL || q->next == NULL)
	{
		return false;
	}
	else
	{
		return true;
	}

}

题目2(返回节点)

给定单链表(head),如果有环的话请返回从头节点进入环的第一个节点。

思路: 

给定慢指针p->next;快指针q->next->next。如图,假设快、慢指针在点3相遇,快指针走过的路径是慢指针的两倍。

慢指针走过的路径长度:m+n
快指针走过的路径长度:m+c*x+n
快指针走过的路径是慢指针的2倍,所以,2*(m+n)=m+c*x+n

由上式得到m=c*x-n=c*x-n+c-c=c*(x-1)+c-n,即m的长度比圆的周长倍数多出c-n的长度,相遇点加上c-n的位置就是进入环的第一个节点。

代码实现:

Node* FirstCircleNode(List plist)
{
	assert(plist != NULL);
	if (plist == NULL||plist->next==NULL)
		return NULL;
	Node* p = plist->next;//慢指针
	Node* q = plist->next->next;//快指针
	for (p, q; q != NULL && q->next != NULL; p = p->next, q = q->next->next)
	{
		if (p == q)
			break;
	}
	if (q==NULL||q->next==NULL)//没有环
	{
		return NULL;
	}
	//快慢指针相遇了
	Node* s = plist;//1
	while (s != q)
	{
		s = s->next;
		q = q->next;
	}
	return s;
}

int main()
{
	Node head;
	InitList(&head);
	for (int i = 0; i < 10; i++)
	{
		Insert_tail(&head, i);
	}
	Show(&head);
	Node* p1 = FirstCircleNode(&head);
	if (p1!=NULL)
		printf("有环,%d\n",p1->data);
	else
		printf("无环\n");

	//Node* q = Search(&head, 3);//链表中的某一个节点(数据域为3)
	//Node* s = Search(&head, 9);//尾巴节点

	//s->next = q;
	//Node* p2 = IsCircle(&head);
	//if (p2 != NULL)
	//	printf("有环,%d\n", p2->data);
	//else
	//	printf("无环\n");

	Node* q = Search(&head, 5);//链表中的某一个节点(数据域为5)
	Node* s = Search(&head, 9);//尾巴节点

	s->next = q;
	Node* p2 = FirstCircleNode(&head);
	if (p2 != NULL)
		printf("有环,%d\n", p2->data);
	else
		printf("无环\n");
	return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s 网络概念与策略控制

一、Kubernetes 基本网络模型 Kubernetes 的容器网络模型可以把它归结为约法三章和四大目标。 1、约法三章 约法三章确保了Kubernetes容器网络模型的基本特性&#xff1a; ① 任意两个 pod 之间可以直接通信&#xff1a;在Kubernetes中&#xff0c;每个 Pod 都被分配了一个…

Ankie聊AI:什么是人工智能?人工智能和普通程序的区别

什么是人工智能&#xff1f; 虽然AI历史很悠久&#xff0c;上个世纪50年代就有各种概念&#xff0c;但是发展很慢。第一次对人类的冲击就是1997年IBM深蓝击败国际象棋世界冠军&#xff0c;引起了人们的广泛关注&#xff0c;之后又销声匿迹。突然间2016人工智能alphaGO战胜了围…

【网站项目】154大学生创新创业平台竞赛管理子系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

货运搬家小程序的功能与解决方案

在繁忙的现代生活中&#xff0c;搬家不再是一件简单的事。从物品的整理、打包到运输、卸载&#xff0c;每一个环节都可能让您感到头疼。而一款优秀的货运搬家APP&#xff0c;正是您解决这些搬家难题的得力助手。 那么货运搬家APP需要具备哪些功能呢&#xff1f; 1.注册与登录&…

PyTorch-神经网络

神经网络&#xff0c;这也是深度学习的基石&#xff0c;所谓的深度学习&#xff0c;也可以理解为很深层的神经网络。说起这里&#xff0c;有一个小段子&#xff0c;神经网络曾经被打入了冷宫&#xff0c;因为SVM派的崛起&#xff0c;SVM不了解的同学可以去google一下&#xff0…

【搭建 Hbase 集群】

搭建 Hbase 集群 一、准备工作二、三台服务器之间的 SSH 免密登录1.修改hosts文件添加DNS映射2.在每台服务器上生成 SSH 密钥对3.将公共密钥&#xff08;通常为 ~/.ssh/id_rsa.pub&#xff09;复制到目标服务器上4.从本地使用 SSH 命令无需密码连接到目标服务器 二、安装JDK1.执…

STM32(9)EXTI

EXTI工作原理 EXTI的寄存器组 每个寄存器都是20个比特位&#xff0c;对应EXTI的20路通道&#xff0c;如这6个寄存器的最左边就都是对应通道1的

基于单片机的红外遥控解码程序设计与实现

摘要:该文介绍基于士兰半导体芯片(SC6122)的红外发射遥控器,通过单片机解码程序,实现红外遥控信号的解码和接收。红外接收头与单片机特定的引脚连接,通过设置单片机定时计数器,采样来自红外接收头的高、低电平宽度解码遥控信号。该解码程序设计主要应用在LED数码显示控制…

芯片的制造详解(1)——沙子到晶圆

哔哩哔哩视频 up:谈三圈&#xff08;2021/8月内容&#xff09; 芯片的制造流程、工艺、设备 面临困境&#xff1a; 国产芯片卡脖子的地方&#xff1a;制造芯片&#xff08;制造过程中的一系列设备和和材料&#xff09;包括但不限于&#xff1a;光刻机、光刻胶、薄膜沉积设备、…

springboot235基于SpringBoot的房屋交易平台的设计与实现

房屋交易平台设计与实现 摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互…

霍尔,磁编码器(AS5600 ,AS5048A)

霍尔编码器&#xff1a; STM32Cube HAL库——霍尔编码器测速&#xff08;电机转速测量&#xff09;-CSDN博客 霍尔编码器&#xff08;Hall Encoder&#xff09;是一种用于测量旋转位置和方向的传感器。它通过感应磁场变化来测量旋转轴的位置和方向。 霍尔编码器通常由霍尔传…

LeetCode-第14题-最长公共前缀

1.题目描述 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 2.样例描述 3.思路描述 按字符串数组每个数组的长度&#xff0c;将字符串数组从小到大排序&#xff1b;他们的公共前缀一定小于或等于最长元素长度…

框架漏洞-->Struts2 Docker_Vulnhub搭建

来浅浅的讲一下Struts2漏洞 目录 1.Docker_Vulnhub搭建 2.Struts2 3.Struts2的框架特征 4.S2-029-->Remote Code Execution 5.漏洞复现 1.RCE 2.Getshell 1.Docker_Vulnhub搭建 因为我用的是Linux&#xff0c;所以我选择直接搭个docker&#xff0c;这里我建议先换个…

2024最新算法:斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)求解23个基准函数

一、斑翠鸟优化算法 斑翠鸟优化算法&#xff08;Pied Kingfisher Optimizer ,PKO&#xff09;&#xff0c;是由Abdelazim Hussien于2024年提出的一种基于群体的新型元启发式算法&#xff0c;它从自然界中观察到的斑翠鸟独特的狩猎行为和共生关系中汲取灵感。PKO 算法围绕三个不…

CHI协议学习

原始文档&#xff1a;https://developer.arm.com/documentation/102407/0100/?langen CHI 总线拓扑结构 CHI总线拓扑是实现自定义的&#xff0c;可以是RING/MESH/CROSSBAR的类型&#xff1b; RING 一般适用于中等规模芯片MESH 一般适用于大规模芯片CROSSBAR 一般适用于小规模…

C++_程序流程结构_循环结构_do while

作用 满足循环条件&#xff0c;执行循环语句 语法 do( 循环语句&#xff09;while&#xff08;循环条件&#xff09; 注意 与while的区别在于do…while会先执行一次循环语句&#xff0c;再判断循环条件 流程图 示例

机器学习-面经(part3)

5. 正则化 5.0 手推L1,L2 5.1 什么是正则化,如何理解 定义: 在损失函数后加上一个正则化项(惩罚项),其实就是常说的结构风险最小化策略,即损失函数 加上正则化。一般模型越复杂,正则化值越大。 正则化项是用来对模型中某些参数进行约束,正则化的一般形式如下: 第一项是…

二元组整数

输入N个整数&#xff0c;输出这个整数两两组合且不重复的所有二元组&#xff0c;要求从小到大输出并且用括号的形式。 输入输出格式 输入描述: 第一行输入一个整数N&#xff0c;N<30。 第二行输入N个整数。 输出描述: 按题意输出。输入输出样例 输入样例#: 3 1 2 3 输出样…

【笔记】OpenHarmony和HarmonyOS区别及应用开发简介

一、概念 OpenHarmony(OH) &#xff1a; OpenAtom OpenHarmonyHarmonyOS(HO)&#xff1a;开发 | 华为开发者联盟 (huawei.com) HO当前最高是3.1&#xff0c;在华为mate 60上面也是。关于4.0、5.0和next这类版本说法都是面向用户的&#xff0c;不是开发人员。对于程序员&#…

使用Docker快速部署Flink分布式集群

前言 大家是否记得自己是怎么开始学习大数据的内容呢&#xff0c;估计关注我得同学会发现前面有点陆续有点关于Docker的小烂文&#xff0c;是因为使用Docker可以最快的速度让我们拥有一个学习的环境。大数据的东西都逃不过搭建环境测试跑通这么一个过程&#xff0c;我自己也是…