原理:先定义指针 pre 和 pcur, 其中 pcur 比 pre 移动的速度要快
假如存在环
进入环后 在环内绕圈 也就是进入 循环
一个移动的快 一个移动的慢,两者终会有相遇的时候
所以结束条件为 pre=pcur 两者相遇 结束循环
#include#include #include typedef struct NUM {//定义一个结构体 int num; struct NUM* pNext; } num, * pnum; //该子函数 是尾插法 void insert(pnum* phead, pnum* ptail, int Input) { pnum pnew = (pnum)calloc(sizeof(num), 1); memset(pnew, 0, sizeof(num)); pnew->num = Input; if (NULL == *phead) { //判断链表是否为空 //如果链表为空 *phead = pnew; *ptail = pnew; } else if (Input <= (*phead)->num) { (*ptail)->pNext = pnew; *ptail = pnew; } } void circle(pnum *phead,pnum *ptail) { int k = 0; pnum pcur = *phead; while (k < 3) { pcur = pcur->pNext; k++; } (*ptail)->pNext = pcur; } int main() { pnum phead = NULL; pnum ptail = NULL; pnum pre = NULL; pnum pcur = NULL; int InPut;//定义要输入的数 while (scanf_s("%d", &InPut) != EOF) { insert(&phead,&ptail,InPut);//调用子函数 在子函数中具体实现功能 } circle(&phead, &ptail); pre = pcur = phead; while (pcur && pcur->pNext) { pre = pre->pNext; pcur = pcur->pNext->pNext; if (pre = pcur) { printf("该链表存在环n"); break; } } if (pcur == NULL || pcur->pNext == NULL) { printf("链表没有环"); } }
运行结果:



