判断链表是否有环
有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。
n存在四种情形:
①为-1,代表该结点的指针域指向NULL,输入结束;
②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;
③指向自己,如第3个结点的指针域指向n = 3的结点;
④指向其直接后继结点,如第3个结点的指针域指向n = 4的结点,不能指向n = 5的结点
PS:本人大一学生,想早点学完C++,但时间不够也没有经验,往往碰上一个难题就要想很久,希望大家不吝赐教
判断是否有环的一般方法知道了,但我不知道怎么构造这个链表,m该怎么理解,难道是第几个结点
而且n的多种情况该如何处理
下面是我的尝试
#include<iostream>
using namespace std;
struct List
{
int num;
List *next;
};
List *head=NULL;
void Create(){
List *p=NULL, *q=NULL, *r=NULL;
int m, n, x=0;
p=new List;
cin>>p->num>>n;
x++;
head=p;
head->next=NULL;
q=p;
while(n!=-1){
if(n==x-1){
r=head;
while(r->next!=q)
r=r->next;
q->next=r;
}
if(n==x){
q->next=q;
}
int g=0;
if(n==x+1){
p=new List;
cin>>p->num>>n;
x++;
q->next=p;
q=p;
}
}
q->next=NULL;
}
bool circle(){
if(head==NULL)
return false;
if((head!=NULL)&&(head->next==NULL))
return false;
if((head!=NULL)&&(head->next==head))
return true;
List *p=head;
List *q=head->next;
while((p->next!=NULL)&&(q->next!=NULL)&&(p!=q)){
p=p->next;
q=q->next->next;
}
if(p==q)return true;
return false;
}
int main()
{
Create();
if(circle())cout<<"true";
else cout<<"false";
return 0;
}
样例输入
1 2
3 3
4 2
5 -1
样例输出
true