判断单向链表中是否存在环
编程思路:
追赶问题:在同一圆环上,当两个物体以不同的速度前进时,他们总能在某个时间点上再次相遇(即当两个指针以不同的移动速度在一个单向链表上移动时,若该链表有环的存在,则这两个指针总会在某一时刻同时指向链表上的同一个节点)。
#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;
}