判断单向链表中是否存在环

判断单向链表中是否存在环

编程思路:
追赶问题:在同一圆环上,当两个物体以不同的速度前进时,他们总能在某个时间点上再次相遇(即当两个指针以不同的移动速度在一个单向链表上移动时,若该链表有环的存在,则这两个指针总会在某一时刻同时指向链表上的同一个节点)。
#include

struct HasRing {
	HasRing* pNext;

	HasRing()
	{
		pNext = nullptr;
	}
};

bool IsHasRing(struct HasRing* pHead);

int main()
{
	struct HasRing* pHead = new struct HasRing;
	struct HasRing* pSecond = new struct HasRing;
	struct HasRing* pThird = new struct HasRing;
	pHead->pNext = pSecond;
	//pSecond->pNext = pHead;
	//pThird->pNext = pHead;
	if (IsHasRing(pHead))
	{
		std::cout << "存在环" << std::endl;
	}
	else
	{
		std::cout << "不存在环" << std::endl;
	}
}

//判断链表中是否存在环
bool IsHasRing(struct HasRing* pHead)
{
	if (nullptr == pHead)
		return false;

	struct HasRing* pTmp1 = pHead;
	struct HasRing* pTmp2 = pHead->pNext;
	while (nullptr != pTmp2)
	{
		if (pTmp1 == pTmp2)
			return true; //存在环

		if (nullptr == pTmp2->pNext)
			return false; //pTmp2走到链表末尾,不存在环

		pTmp1 = pTmp1->pNext; //pTmp1前进一个节点
		pTmp2 = pTmp2->pNext->pNext; //pTmp2前进两个节点
	}

	return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值