如何判断链表是否存在环?

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个结点的指针。当后者找到了链表结尾处,则前者正好在链表中间处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值