判断单向链表是否有环

1.设立2个指针i,j指向头结点

2.i走1步,j走2步.如果有环,j一定能追上i;

3.如果j不为空,且i和j相等此链表即为有环。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct student                                              //定义链表结构
{
	int num;
	struct student *pnext;
}stu,*pstu;
void link_tail_insert(pstu *phead,pstu *ptail,int i);                       
void link_show(pstu );    
void link_judge_loop(pstu phead);                                                  
void main(){
	pstu phead,ptail;
	int i;
	phead = NULL;
	ptail = NULL;
	while(scanf("%d",&i) != EOF){                                     
		link_tail_insert(&phead,&ptail,i);
	}
	link_show(phead); 
	ptail->pnext = phead;                                          //单链表建立环
	link_judge_loop(phead);                                          
	system("pause");

}
void link_tail_insert(pstu *phead,pstu *ptail,int i){             //尾插法建立链表
	pstu pnew;
	pnew = (pstu)malloc(sizeof(stu));
	memset(pnew,0,sizeof(stu));
	pnew->num = i;
	if(*ptail == NULL){
		*phead = pnew;
		*ptail = pnew;
	}
	else{
		(*ptail)->pnext = pnew;
		*ptail = pnew;
	}
}
void link_show(pstu phead){                                       //输出链表
	pstu pshow;
	pshow = phead;
	if(phead == NULL)
	{
		printf("no exsit\n");
		return;
	}
	while(pshow != NULL){
		printf("%d ",pshow->num);
		pshow = pshow->pnext;
	}
	putchar('\n');
}
void link_judge_loop(pstu phead){                               //判断是否有环
	pstu i,j;
	i = j = phead;
	while(j != NULL){ 
		i = i->pnext;
		j = j->pnext;
		if(j == NULL)                                         	//j要分步走,判断是否为空,是空则结束循环
			break;
		j = j->pnext;                                        
		if(i == j)                                               //i和j相等,有环
			break;
	}
	if(j != NULL && i == j)
		printf("link has loop\n");
	else
		printf("link has no  loop\n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值