今天,推荐音乐《丝绸之路》--喜多郎
判断一个单向链表是否存在环
- 使用两个指针p和q,p=q=head;
- 如果q->next非null,q=q->next->next;如果p非null,p=p->next;
- 循环步骤2,直至p==q;
- 如果p、q均非null,则存在环,否则无环。
即q指针每次移动两个元素,p每次移动一个元素,当q追上p则存在环。
判断链表的环的长度
将上个问题p和q的相遇点记为join。
- length=0 p=join,q=join;
- 如果p!=q, p=join,q=join->next->next,length++;
- 重复步骤2至p=q;
- legth即为环的长度。
原理:当q追上p的时候,必定是p移动了一圈,q移动了两圈;p的位移即环的长度。
判断有环的链表的连接点
连接点:即最后一个元素的next指向的节点(如上图的第二个节点)。
结论:头结点到连接点的距离=连接点到join的距离。分别从join、头指针开始走,每次走一步,相遇的那个点就是连接点。
链表长度
- 从问题二知道环的长度a;
- 从为题三知道连接点。从head开始,遍历到连接点,得到head到连接点的长度b。
- 链表长度=a+b-1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。