测试链表是否打环 -- C语言

83 篇文章 2 订阅
30 篇文章 0 订阅

原理

这里 有一个 比较 简单 的 解法。 设置 两个 指针 p1、 p2。 每次 循环 p1 向前 走 一步, p2 向前 走两步。 直到 p2 碰到 NULL 指针 或者 两个 指针 相等 时 结束 循环。 如果 两个 指针 相等, 则 说明 存在 环。

代码实现

bool whetherListLoop(st_dataNode * head){
	if(NULL == head){ /*空链表打环个毛线*/
		return false;
	}	

	bool rst = false; /* 默认不是打环的 */
	st_dataNode * pos1 = NULL, * pos2 = NULL;

	pos1 = pos2 = head;
	if(NULL == pos1->next){ /*head后一个节点且下一个为NULL,不可能打环*/
		goto out;
	}
	
	while(NULL != pos1 && NULL != pos1->next){
		/*一个走两步,一个走一步,看看能不能跟的上*/
		pos1 = pos1->next->next;
		pos2 = pos2->next;
		if(pos1 == pos2){
			rst = true;
			goto out;
		}
	}

	if(pos1 == pos2){
		rst = true;
		goto out;
	}

	
out:
	return rst;
}



void testWhetherLopp(void){
	printf("====== %s ===========\n", __func__);
	st_dataNode * tail = NULL;
	bool rst = false;

	rst = whetherListLoop(ghead);
	if(rst){
		printf("\t List Loop\n");
	} else {
		printf("\t Not Loop\n");
	
	}

	tail = ghead;
	while(tail->next != NULL){
		tail = tail->next;
	}

	tail->next = ghead;

	rst = whetherListLoop(ghead);
	if(rst){
		printf("\t List Loop\n");
	} else {
		printf("\t Not Loop\n");	
	}
	tail->next = NULL;
	dumpList(ghead);

	return;
	
}

调试编译

gcc listMain.c list.c -o a.exe -DDEBUG

调试输出

====== testWhetherLopp ===========
         Not Loop
         List Loop
========= Dump List 0x76d090 ===========
         0  4  6  19  22  29  32  47  53  116
===================================

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值