8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?相关的知识,希望对你有一定的参考价值。

8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?

技术分享

思路:

        注意分析题意,题意并非是说单链表完全成O形状的环,而是说单链表成6形状的环。

        首先判断是否有环:为此我们建立两个指针,从Head一起向前跑,一个步长为1,一个步长为2,用

  while(直到步长2的跑到结尾)
{
检查两个指针是否相等,直到找到为止。
}

来进行判断。

            原因是,在这场跑步中,结束循环有两种可能,其一是原来无环,所以2先跑到结尾,因为2比1快,二者不可能相等。其二是原来是有环的,因为这场赛跑永远没有z终点,但是在环中,由于2比1快,因而必定套圈,也即2追上了1,这在无环中是不可能出现的情况。

           而进行计算环的长度,只要找到交汇点,然后在圈中跑一次就可以了。

int getCircleLength(Node* cross)

bool judgeCircleExists(Node* Head)

//单链表成环,计算环的长度(输入的参数为成环的交汇点)
int getCircleLength(Node* cross)
{
     int len=1;
     Node* p=cross;
     while(p->next!=cross)    //不能写作 p->next!=p
     {
          len++;
          p=p->next;
     }
     return len;
}   

  

 

//判断单链表是否有环,并且返回环的长度
bool judgeCircleExists(Node* Head,int &len)
{
     if(Head==NULL)    //空链
          return false;
     else if(Head->next==Head)    //1个节点且成环
          return true;
     else if(Head->next==NULL)    //1个节点不成环
          return false;

     //至少两个节点情形
     //初始化跑步机
     Node* p1=Head;              //跑步者1号,跑到第1个节点
     Node* p2=Head->next;    //跑步者2号,跑到第2个节点
     while(p2!=NULL&&p2->next!=NULL)  //利用了&&短路
     {
          p1=p1->next;
          p2=p2->next->next;
          if(p1==p2)
          {
               //此时p1(p2)即为交汇点
               len=getCircleLength(p1);
               return true;
          }
     }
     return false;
}    

  

 

以上是关于8.判断单链表是否有环(6形状)?如何找到环的“起始”点?如何知道环的长度?的主要内容,如果未能解决你的问题,请参考以下文章

判断一个链表是否有环的几种方法

判断一个单链表是否有环及环的连接点

判断一个单链表是否有环及环的连接点

判断链表中是否有环 ----- 有关单链表中环的问题

单链表交叉问题(单链表存在环的问题)

有环单链表