版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25244495/article/details/83446581
参考博客:https://www.cnblogs.com/dancingrain/p/3405197.html
bool HasLoop(Node* root, Node* &Entry)
{
if(!root) return false;
bool bHasLoop = false;
Entry = nullptr;
Node* pFast,*pSlow;
pSlow = pFast = root;
while(pFast)//pFast->pNext当pFast为nullptr时会报错:无法计算表达式的值
{
pSlow = pSlow->pNext;
if(!pFast->pNext) return false;//pFast->pNext当pFast为nullptr时会报错:无法计算表达式的值
pFast = pFast->pNext;
if(!pFast->pNext) return false;
pFast = pFast->pNext;
if(pSlow == pFast)
{
bHasLoop = true;
break;
}
}
if(!bHasLoop) return false;
while(root != pSlow)
{
root = root->pNext;
pSlow = pSlow ->pNext;
}
Entry = pSlow;
return true;
}
测试主函数:
struct Node
{
Node* pNext;
int val;
Node(int v)
{
val = v;
pNext = nullptr;
}
};
int main()
{
Node *root = new Node(0);
Node *curNode = root;
Node *entrySet;
for (int i=1;i<=98;i++)
{
curNode->pNext = new Node(i);
curNode = curNode->pNext;
if(i == 98) entrySet = curNode;//标记环形链表入口
}
curNode->pNext = new Node(99);//一共100个节点,值为0-99
curNode->pNext->pNext = entrySet;//构造环形链表
Node* entryGot;
bool bHasLoop = HasLoop(root,entryGot);
if(bHasLoop)
cout << entryGot->val << endl;
system("pause");
return 0;
}