判断单链表有环:快慢指针fa(简单版)

在这里插入代码片
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
 
using namespace std;
 
struct ListNode 
{
	ListNode * next ;
	int x ;
	ListNode(int x ):x(x),next(NULL)
	{
	}
};
bool hasCycle(ListNode * head)
{
	ListNode *root = head;
	if(root == NULL || root->next == NULL)
	{
		return 0;
	}
	else 
	{
		ListNode * fast ,* slow;
		fast = slow = root;
		whilt( fast != NULL && slow != NULL && slow->next != NULL)
		{
			slow = slow->next;
			fast = fast->next->next;
			if(fast == slow)
			{
				// 此时此刻 ,第一次重合,找环的起点:
				// 让其中slow指针指向起点, fast指针不动,
				// 然后两个指针每次都移动一步, 
				// 当slow指针移动a次指向循环起点时,
				// fast指针刚好也指向循环起点
				for(slow = head; slow != fast; slow = slow->next,fast = fast->next)
				// 此时slow就是起点
					;
				return true;
				// 如果需要找环的长度
			}
			printf("slow:%d,fast:%d\n",slow->x,fast->x);
		}
		return false;
	}
}

面试问答
另外记录一个 写的比较完整的文章链接
https://www.cnblogs.com/geziyu/p/9903952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值