1. 程式人生 > >【面試題】求連結串列的環入口點

【面試題】求連結串列的環入口點

環入口點:我們設A是連結串列的起點,B是環的入口點,C是環內快慢指標的相遇點。兩個快慢指標定義為slow和fast.

slow走的路程:A->B->C;

fast走的路程:A->B->C->B->C;

2*(x+y)=x+y+z+y        =》       x=z;

即A->B的路程等於C->B的路程;

//環的入口點
void FinLoopEntry(List*head)
{
   List*fast=head;
   List*slow=head;
   if(fast==NULL||slow==NULL)
   {
      return;
   }
   while(fast!=NULL&&slow!=NULL)//先讓快指標走兩步,慢指標走一步,直到第一次相遇
   {
      slow=slow->next;
	  fast=fast->next->next;
      if(slow==fast)
      {
          break;
      }
   }
   slow=head;//第一次相遇後,讓slow指標從連結串列頭開始走
   while(slow!=fast)
   {
      slow=slow->next;
	  fast=fast->next;
   }
   return slow;
}