2021/2/1 如何判断链表是否存在环?
详细表述: 如题。
方法1:暴力法。
直接遍历整个链表,查看链表是否存在重复结点。如果存在重复结点,则该链表存在环。
方法2:增加链表域法。
如果可以更改链表的域,则在其中增加”visit”域,初始值为0。如果访问过该结点,则将其”visit”域更改为1。在查看下一个结点时,首先访问其“visit”域,如果其域为0,则将其“visit”域更改为1,继续遍历;如果其域为1,则说明该链表存在环。
方法3:数组记录法。
如果无法更改链表的域,则可以设置一个数组,将访问过的结点的值记录在数组中。在访问结点时,首先判断是否存在在该数组中。如果不存在,则将其值记录在该数组中;如果存在,则该链表存在环。
方法4:不同速度遍历法。
选用两个不同速度的指针遍历该链表。如果后续两个指针相遇在同一个结点中,则说明该链表存在环。
原因:
为什么fast 走两个节点,slow走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢?
首先第一点: fast指针一定先进入环中,如果fast 指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。
那么来看一下,为什么fast指针和slow指针一定会相遇呢?
这是因为fast是走两步,slow是走一步,其实相对于slow来说,fast是一个节点一个节点的靠近slow的,所以fast一定可以和slow重合。
PS:寻找链表的中间结点方法:
选用一个前进速度为1个结点的指针,一个前进速度为2个结点的指针。当后者找到了链表结尾处,则前者正好在链表中间处。
版权声明:本文为zhangxin_nuaa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。