c语言——判断单链表是否有环

本文介绍了一种检测链表中是否存在环的算法。通过定义两个指针,一个快指针和一个慢指针,在链表中移动。快指针每次移动两步,慢指针每次移动一步。如果链表中有环,则这两个指针最终会相遇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:先定义指针 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("链表没有环");
	}

}
	

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值