C语言面试题进阶篇

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里面存的就是环的长度。

你可能感兴趣的:(c++)