解决关于单链表中存在环的问题
1.单链表中环的概念
所谓单链表中存在环 即在单链表中存在某个结点的指针指向的下一结点为其前方的某个结点位置
从而形成一个封闭的环状
2.快慢指针判断是否存在环
Status HasLoop(LinkList L){
LinkList slowPtr = L; //满指针每次移动1位
LinkList fastPtr = L; //快指针每次移动2位
while(slowPtr&&fastPtr&&fastPtr->next){//三者均不为NULL时
slowPtr = slowPtr->next; //分别移动快慢指针
fastPtr = fastPtr->next->next;
if(slowPtr==fastPtr){ //当存在环时 两指针势必会在环内的某个位置相遇
return TRUE;
}
}
return FALSE;
}
3.环的起始结点
/*
找出环的起始结点
*/
LinkList SearchStartnode(LinkList L){
int LoopExist; //标志变量
LinkList slowPtr = L;
LinkList fastPtr = L;
while(slowPtr&&fastPtr&&fastPtr->next){//三者均不为NULL时
slowPtr = slowPtr->next; //分别移动快慢指针
fastPtr = fastPtr->next->next;
if(slowPtr==fastPtr){ //当存在环时 两指针势必会在环内的某个位置相遇
int LoopExist = 1; //置LoopExist为1
break;
}
}
if(LoopExist){ //当存在环时 fastPtr指针不动 使slowPtr = L
slowPtr = L;
while(slowPtr!=fastPtr){ //每次同时移动slowPtr 和 fastPtr
fastPtr = fastPtr->next;
slowPtr = slowPtr->next;
}
if(slowPtr==fastPtr){ //两者必会在环的起始结点处相遇
return slowPtr;
}
}
return NULL;
}
4.环的长度
/*
求出环的长度
*/
int LoopLength(LinkList L){
int LoopExist;
LinkList slowPtr = L;
LinkList fastPtr = L;
while(slowPtr&&fastPtr&&fastPtr->next){//三者均不为NULL时
slowPtr = slowPtr->next; //分别移动快慢指针
fastPtr = fastPtr->next->next;
if(slowPtr==fastPtr){ //当存在环时 两指针势必会在环内的某个位置相遇
int LoopExist = 1;
break;
}
}
if(LoopExist){//当环存在时
int counter = 0; //计数器
fastPtr = fastPtr->next;
while(slowPtr!=fastPtr){ //移动fastPtr 最后与slowPtr相等时即遍历一圈
counter++;
fastPtr = fastPtr->next;
}
if(slowPtr==fastPtr)
return ++counter; //少算了一次 最后返回值+1
}
return 0;
}
5.单链表链式存储基本操作
——————END-2021-11-01——————
作者注:
记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~