如果单链表中有环,那么找出入环的第一个节点

来源:互联网 发布:magnet关联的软件 编辑:程序博客网 时间:2024/06/09 15:03

如果单链表有环,找出入环的第一个节点,
如果单链表有环,那么就应该存在两个指针,能够在环上存在两个指针相同。
p1 == p2
这样就在p1处断开这个环,相当于一个Y型的相交环了,一个单链表头结点为head ,另一个单链表头结点为p1 ,这样就从head ,p1出发,直到找出第一个相等的节点就是入环的第一个节点了

 // 首先要找到是否有环,并找到在换上相同的那个节点,并返回节点
node *is_findx_circle(node *head)
{
             node *p1,*p2,*p;
             p1 = head->next;
             p2=head->next->next;
             while(p1 !=NULL && p2!= NULL)
             {
                    if( p1==p2 )
                    {
                            p = p1;
                    }
                    p1 = p1->next;
                     p2=p2->next->next;
                     
             }
             return p;
}


// 找出点链表中第一个相交的点
node *find_frist(node *head1 ,node *head2)
{
            int len1 ,len2,i ;
            node *p1,*p2;
            p1 = p1->next;
            p2 = p2->next;
            len1 = length(head1);
            len2 = length(head2);
            if(len1 > len2)
            {
                   for(i = 0 ; i <len1-len2 ; i++)
                    {
                          p1 = p1->next;
                    }
            }
            if(len2>len1)
            {
                   for( i =0;i<len2-len1 ; i++)
                   {
                          p2 = p2->next;
                   }
            }
            while( (p1 != NULL) && (p2 != NULL) )
           {
                  if(p1==p2)
                  {
                         return p1;
                         break;
                  }
                  else
                 {
                        p1 = p1->next;
                        p2 = p2->next;
                 }
           }
}

















原创粉丝点击