使用两个指针,一个指针每次递增一步,另一个指针每次递增两步。
代码如下:
#include<iostream>
using namespace std;
struct node
{
char val;
node *next;
};
bool check(node *head)//此函数复杂度为O(N)
{
if (head==NULL)
{
return false;
}
node *low=head;
node *high=head->next;
while (high!=NULL && high->next!=NULL)
{
low=low->next;
high=high->next->next;
if (low==high)
{
return true;
}
}
return false;
}
int main(int argc, char* argv[])
{
node *p=(node*)malloc(sizeof(node));
int flag;
node *q=p;
char ch;
node *t=(node*)malloc(sizeof(node));
cin>>ch;
p->next=NULL;
while (ch!='@')
{
t->val=ch;
t->next=p->next;
p->next=t;
p=t;
t=(node*)malloc(sizeof(node));
cin>>ch;
}
p->next=q->next;
//cout<<p->val<<q->next->val<<endl;
q=q->next;
flag=check(q) ;
if (!flag)
{
cout<<"该链表不是环!"<<endl;
}
else
{
cout<<"该链表是环!"<<endl;
}
free(p);
free(q);
free(t);
return 0;
}