C语言面试题进阶篇

本文深入探讨了C语言中链表处理的问题,包括判断单链表是否有环并求环的长度及入口点,以及处理两个链表相交的情况,即使链表可能带有环。通过快慢指针、长度差计算等方法,解决了链表复杂条件下的相交判断和交点定位问题。
摘要由CSDN通过智能技术生成

1.判断单链表是否带环?若带环,求环的长度?求环的入口点?

首先判断是否带环,在这里用快慢指针,快指针每次走两步,慢指针每次只走一步,无环的快指针会先走到头,如果快指针等于慢指针那么说名单链表存在环,会返回相遇点,如果无环会返回空指针。为什么一个走两步一个走一步就可以呢,因为fast比slow走的快,所以进入环是fast一定在slow前面(或相遇),假设领先n步,fast每次必slow先走一步,所以每走一次俩者间距离减少为n-1步,最后俩者一定会相遇,如果走三步或则三步以上有可能快慢指针会错过。

//assert(pList&&pList->next);
//ListNode* fast = pList->next->next;
//ListNode* slow = pList;
//while (fast!=slow)
//{
//	fast=fast->next->next;
//	slow=slow->next;
//}
//if (fast==slow)
//{
//	return fast;
//}
//return NULL;
ListNode* IsCycle(ListNode *pList)//是否带环
{

	if(pList==NULL||pList->next==NULL)
		return NULL;
	ListNode* fast = pList->next->next;
	ListNode* slow = pList->next;//注意这里也要走一步
	while (fast&&fast->next&&fast!=slow)
	{
		fast=fast->next->next;
		slow=slow->next;
	}
	if (fast==slow)
	{
		return fast;
	}
	else
	{
		return NULL;
	}
}


求环的长度,根据上一步返回的相遇点,我们可以把这个指针的值给一个临时指针,给一个count,让它再走一圈,当等于相遇点的时候就是走了一圈,此时count里面存的就是环的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值