链表是否是环链

搜东西的时候看到的,自己看了看别人的讨论,写了个方法。

基本思想:申明两个临时指针,一个一次走一步,一个一次走两步,看最后是否能够相等,如果有环,肯定会出现相等的情况;没有环,应该能够正常结束。

定义一个结构体:

typedef struct node
{
	int info;
	struct node* next;
}LINKLIST;

查找方法:
bool findCircle(LINKLIST *begin)
{
	if(begin == NULL || begin->next ==NULL)
	{
		return false;
	}

	if(begin->next == begin)
	{
		return true;
	}

	LINKLIST *first, *second;
	first = begin;
	second = begin->next->next;

	while( first != second && second != NULL && second->next !=NULL)
	{
		first = first->next;
		second = second->next->next;
	}

	if(first == second)
	{
		return true;
	}

	return false;
}

方法有点笨,主要是一个要先走两步,一个后走一步。

最后写个main测试下:

int main()
{
	LINKLIST A;
	LINKLIST B;
	LINKLIST C;
	LINKLIST D;
	A.info = 1;
	B.info = 2;
	C.info = 3;
	D.info = 4;

	LINKLIST* p = NULL;
	p = &A;
	LINKLIST* q = NULL;
	q = &A;
	A.next = &B;
	B.next = &C;
	C.next = &D;
	D.next = NULL;

	if(findCircle(&A))
	{
		printf("链表中有环");
	}
	else
	{
		printf("链表中没有环");
	}
}
这个是没有环的,最后能输出“链表中没有环”;修改D.next = &B,这样会输出“链表中有环”;

csdn上讨论的网址:http://topic.csdn.net/t/20061112/15/5151874.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值