原理:先定义指针 pre 和 pcur, 其中 pcur 比 pre 移动的速度要快
假如存在环
进入环后 在环内绕圈 也就是进入 循环
一个移动的快 一个移动的慢,两者终会有相遇的时候
所以结束条件为 pre=pcur 两者相遇 结束循环
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
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("链表没有环");
}
}
运行结果: