参考:https://blog.csdn.net/u012534831/article/details/74231581
https://www.jianshu.com/p/36a89d938440
https://blog.csdn.net/lianai911/article/details/24458291
判断链表中是否有环:大概就是说两个指针首先都指向链表的首部,然后一个每次走一步,一个每次走两步,如果有环,那么慢的肯定能够追上快的,否则快的就会先到达终点。
求环的长度:两个指针重合时,快的停止,慢的每次走一步,计算圈的长度。
求环的起点:
if(head!=NULL){
int *fastptr=head;
int *slowptr=head;
//确定是否有环
bool isCircle=true;
do{
if(slowptr->next==NULL || fastptr->next->next==NULL){
isCircle=false;
break;
}
slowptr=slowptr->next;
fastptr=fastptr->next->next;
}while(fastptr!=slowptr);
//确定环的长度
int len=0;
do{
slowptr=slowptr->next;
len+=1;
}while(slowptr!=fastptr);
//求环的起点
slowptr=head;
while(slowptr!=fastptr){
slowptr=slowptr->next;
fastptr=fastptr->next;
}
}