判断单链表中是否有环
单链表中的循环链表尾结点不一定指向头结点,也可以指向任意中间结点。
此时若想判断单链表中是否有环,就不能只是简单的根据尾结点的next是不是头结点来判断,
在此我提供三种方法:
方法一:
创建两个指针p和q,其中p用来遍历指针,每次只走一步,并记录从根节点出发所走的步数,而q则是每次从根节点出发,到达p此时所在的位置,并记录步数,判断二者的步数是否相同来判断链表中是否有回环。
如图所示,6的下个结点是3,此时p从6到3,走了7步,而q从头结点走到3只需要3步,步数不相同,则说明有回环。
方法二:
对方法一进行改进,两个指针进行遍历时,q会造成很多时间浪费,因此单对判断链表是否有环来说,可以对结点进行改变,使得每个结点多出位置用来存放步数,对整个链表进行遍历,并填写步数,若步数不为空,说明此结点以及遍历过,说明有环。
方法三:
利用快慢指针,第一个指针以第二个指针的两倍速度进行遍历,若没有环,则二者永远不可能相遇,若有环,则在某个时刻总会有二者结点相同。