数据结构 ——— 单链表oj题:环状链表(判断链表是否带环)

目录

题目要求

手搓简易环状单链表

代码实现

[问题1:slow 指针和 fast 指针一定会相遇吗](#问题1:slow 指针和 fast 指针一定会相遇吗)

[问题2:slow 每次走一步,fast 每次走 n 步是否还能判断链表带环?(n > 2)](#问题2:slow 每次走一步,fast 每次走 n 步是否还能判断链表带环?(n > 2))


题目要求

有一个单链表的头节点 head,判断链表中是否有环

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环,返回 true,否则返回 false


手搓简易环状单链表

代码演示:

复制代码
struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n1);
struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n2);
struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n3);
struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
assert(n4);

n1->val = 3;
n2->val = 2;
n3->val = 0;
n4->val = -4;

n1->next = n2;
n2->next = n3;
n3->next = n4;
n4->next = n2;

代码实现

代码演示:

复制代码
bool hasCycle(struct ListNode* head)
{
	struct ListNode* slow = head;
	struct ListNode* fast = head;

	while (fast != NULL && fast->next != NULL)
	{
		slow = slow->next;
		fast = fast->next->next;

		if (slow == fast)
			return true;
	}

	return false;
}

代码解析:

利用快慢指针的思路解决,slow 指针一次走一步,fast 指针一次走两步,当 slow 指针的地址和 fast 指针的地址相同时,就说明链表是环状链表,否则 fast 指针就会走到 NULL

代码验证:

是环状链表时:

不是环状链表时:


问题1:slow 指针和 fast 指针一定会相遇吗

解答:

在 slow 指针一次走一步,fast 指针一次走两步的情况下,一定会相遇

fast 会先进入环中,slow会后进入,假设 slow 进入环后,fast 和 slow 的距离为 N

那么 fast 每走两步,slow 每走一步,距离 N 就会递减 1

N 的值一直递减 1 ,直到最后 N 的长度为 3......2......1......0

当 N 的长度为 0 时,就说明 slow 和 fast 指针相遇了

且 N 为正整数,那么只要是递减 1 ,就一定会递减到 0,所以 slow 和 fast 就一定会相遇


问题2:slow 每次走一步,fast 每次走 n 步是否还能判断链表带环?(n > 2)

解答:

当 slow 每次走一步,fast 每次走 3 步时,不一定会相遇

fast 会先进入环中,slow会后进入,假设 slow 进入环后,fast 和 slow 的距离为 N

那么 slow 每次走一步,fast 每次走 3 步,他们的距离就会缩小 2

也就是 N 的值一直递减 2,就会出现两种情况

情况1:当 N 为偶数时,每次递减2,直到最后 N 的长度为 4......2...... 0(会相遇)

情况2:当 N 为奇数时,每次递减2,直到最后 N 的长度为 3......1......-1(会错过)

且错过后,假设环的长度为 C ,那么 fast 和 slow 的距离就是 C - 1

那么此时 当 C-1 为偶数时,fast 和 slow 就会相遇,否则就永远都不会相遇

当 fast 每次走 4 步时也是一样的,假设 slow 进环后,距离为 N

slow 每走一步,fast 每走 4 步,就会缩小 3 步

那么只有当 N 的值是 3 的倍数时,slow 和 fast 才会相遇,其他情况就不会相遇

相关推荐
陈苏同学24 分钟前
笔记1.4:机器人学的语言——三维空间位姿描述 (旋转矩阵 - 齐次变换矩阵 - 欧拉角 - 四元数高效表示旋转)
笔记·线性代数·算法·机器人
scx201310041 小时前
20251025 分治总结
数据结构·c++·算法
碧海银沙音频科技研究院1 小时前
DiVE长尾识别的虚拟实例蒸馏方法
arm开发·人工智能·深度学习·算法·音视频
居7然2 小时前
DeepSeek OCR:重新定义AI文档处理的“降本增效”新范式
人工智能·算法·语言模型·自然语言处理·大模型·ocr
while(1){yan}2 小时前
数据结构之堆
数据结构·python·算法
Lear3 小时前
C语言与C++在基础语法上的区别
c语言
SleepyWhite0013 小时前
代码随想录Day61|Floyd 算法精讲、A * 算法精讲
算法·floyd算法·astar算法
Miraitowa_cheems3 小时前
LeetCode算法日记 - Day 84: 乘积为正数的最长子数组长度
数据结构·算法·leetcode·贪心算法·线性回归·深度优先·动态规划
云知谷3 小时前
【经典书籍】C++ Primer 第19章特殊工具与技术精华讲解
c语言·开发语言·c++·软件工程·团队开发
雾岛听蓝3 小时前
C语言:使用顺序表实现通讯录
c语言·数据结构·经验分享·笔记·visualstudio