判断一个较大的单链表是否有环及求环的入口点

本文介绍了两种检测单链表中是否存在环的有效方法:双指针法和哈希表法,并给出了寻找环入口点的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*判断单链表中是否有环*/

struct ListType
{
	int data;
	struct ListType *next;
};


typedef struct ListType *list;

int IsLoop(list s)
{//双指针法

	list fast = s;
	list slow = s;
	
	if(fast == NULL)
		return -1;

	while(fast && fast->next)
	{
		fast = fast->next->next;
		slow = slow->next;
		if(fast == slow)
			return 1;
	}
	return !(fast == NULL) || (fast->next == NULL);
}

#include<map>

using std::map;

typedef struct node
{
	int data;
	struct node *next;
}node;

map<node*,int>m;

bool IsLoop(node *head)
{//hash表法
	if(!head)
	{
		return false;
	}

	node *p = head;
	while(p)
	{
		if(m[p] == 0)       //默认都是0
		{
			m[p] = 1;
		}
		else if(m[p] == 1)
			return true;
		p = p->next;
	}
}

list *FindLoopPort(list *head)
{//寻找入口点

	list *slow = head,*fast = head;
	while(fast && fast->next)
	{//寻找相遇点

		slow = slow->next;
		fast = fast->next->next;
		if(slow == fast)
			break;
	}

	if(fast == NULL || fast->next == NULL)
		return NULL;

	slow = head;
	while(slow != fast)
	{//slow指针从起点开始走,fast指针从相遇点开始走,俩指针相遇处即为环的入口点
		slow = slow->next;
		fast = fast->next;
	}
	return slow;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值