这道题作为考察程序员的基本数据结构-链表的操作和算法是一道不错的题,也是一道经常面试到的一道题,我从网上查了一下,这里只写一下算法思想,实现由读者自己去实践下,下面转入正题:
已知头结点,判断一条单链表是否有环可用三种方法,算法思想如下:
1.追赶法。设两个指针,一个快指针(步长为2),一个慢指针(步长为1),从头开始遍历。
2.查表法。把遍历过的指针放到另一个表中,每次遍历的新结点与已遍历过的结点对比,若有相同的结点说明有环,若到结尾仍未发现有相同的结点,是视为无环。
3.反转法。是使用反转指针的方法,每过一个节点就把该节点的指针反向。当有环的时候,最后指针会定位到链表的头部,如果到最后,都没有再到头部,那说明链表不存在循环。
由此引申出来的问题在家有:
1)环有多长?
2)求出环的连接点
3)带环链表的长度
以追赶法为例来说一下我解决这三个问题的算法,至于什么有什么定理做依据就不再阐述,读者要是有什么好的算法一定要不吝赐教。
1)以碰撞点为始点往下遍历,若有环定会回到此碰撞点,那么再次回到此碰撞点经过的结点个数就是环的长度。
2)从头结点开始,每往下遍历一个结点都与环上的结点对比,若与环中的某个结点一样,则此结点就是该环的连接点。
3)由1)和2)不难得出。