今天,推荐音乐《丝绸之路》--喜多郎

判断一个单向链表是否存在环

  1. 使用两个指针p和q,p=q=head;
  2. 如果q->next非null,q=q->next->next;如果p非null,p=p->next;
  3. 循环步骤2,直至p==q;
  4. 如果p、q均非null,则存在环,否则无环。

即q指针每次移动两个元素,p每次移动一个元素,当q追上p则存在环。
图片描述

判断链表的环的长度

将上个问题p和q的相遇点记为join。

  1. length=0 p=join,q=join;
  2. 如果p!=q, p=join,q=join->next->next,length++;
  3. 重复步骤2至p=q;
  4. legth即为环的长度。

原理:当q追上p的时候,必定是p移动了一圈,q移动了两圈;p的位移即环的长度。
图片描述

判断有环的链表的连接点

连接点:即最后一个元素的next指向的节点(如上图的第二个节点)。
结论:头结点到连接点的距离=连接点到join的距离。分别从join、头指针开始走,每次走一步,相遇的那个点就是连接点。

链表长度

  1. 从问题二知道环的长度a;
  2. 从为题三知道连接点。从head开始,遍历到连接点,得到head到连接点的长度b。
  3. 链表长度=a+b-1

曾纪文
201 声望22 粉丝