【演算法】2013創新工場校園招聘筆試題--如何求出帶環連結串列的入口節點

pengfoo發表於2012-10-01

參考文章:

http://blog.163.com/song_0803/blog/static/4609759720120910373784/

因而,可以在連結串列頭,相遇點分別設定一個指標,每次各走一步,兩個指標必定相遇,則相遇第一點為環入口點

從圖中可以分析a=(n-1)r+(L-a-x)的含義:

a代表在連結串列頭放置的節點p1走到入口點的路程,L-a-x代表相遇點的節點p2走完這麼多的路程就到達入口點,但是必須再走n-1圈,(此時路程與p1相同)

,正好首次相遇。 

LinkList *  ListLoop(LinkList *list) //判斷一個連結串列中是否有環,list為連結串列頭結點
{
	int isLoop=0;
	LinkList *fast,*slow;
	fast=list;
	slow=list;
	while(fast&&fast->next)
	{
		slow=slow->next;
		fast=fast->next->next;//fast每次兩步,slow每次一步
		if(fast==slow) //當兩指標相等時,判斷連結串列中有環
		{
			isLoop=1;
			break;
		}
	}
	if(isLoop==1)//連結串列中有環時
	{
		slow=list;
		while(slow!=fast)//一個頭指標,一個相遇點指標,兩個第一次相等時為環入口點
		{
			slow=slow->next;
			fast=fast->next;
		}
		return slow;
	}
	else 
	{
		cout<<"連結串列中沒有環";
		return NULL;
	}
} 


 

 

相關文章