两个指针(初始值指向哪其实无所谓),一个步长为1,一个步长为2, 若相遇,则有环;反之,无环
#include <iostream>
using namespace std;
struct LinkNode{
int m_nValue;
LinkNode* next;
};
typedef LinkNode* LinkList;
void InsertList(LinkList &list, int data)//建立链表
{
LinkList head=list;
LinkList p=list;
LinkList q;
if(head==NULL)
{
head=(LinkList)malloc(sizeof(LinkNode));
head->m_nValue=data;
head->next=NULL;
list=head;
}
else
{
while(p->next)
p=p->next;
q=(LinkList)malloc(sizeof(LinkNode));
q->m_nValue=data;
q->next=NULL;
p->next=q;
}
}
bool isCircle(LinkList list)//是否有环
{
LinkList p=list->next;
LinkList q=list;
while(p->next!=NULL && p && q)
{
p=p->next->next;
q=q->next;
if(p==q)
return true;
}
return false;
}
void main()
{
LinkList first=NULL;
InsertList(first,10);
InsertList(first,12);
InsertList(first,-11);
InsertList(first,45);
InsertList(first,23);
InsertList(first,75);
InsertList(first,66);
InsertList(first,82);
//构造环,尾节点接到第三个节点前
LinkList p=first;
while(p->next)
p=p->next;
LinkList q=first;
for(int i=1; i<=2; i++)
q=q->next;
p->next=q;
if(isCircle(first))
cout<<"有环"<<endl;
}