一.什么是链表带环
二.如何实现链表带环
三.带环链表和单链表的异同
四.带环链表扩展问题
一.什么是链表带环
可以理解成用环把链表连接起来
而链表中任意节点可以指向任意节点位置(包含指向自己)
如下图
其中M点是起始位置,E点是入环节点,N是相遇点,我们在假设环长为R.
二.如何实现链表带环
a.我们对带环链表有了初步认知,那该如何实现链表带环呢?
在实现链表带环之前,我们可以先想想运动会上比长跑比赛,在长跑比赛中,我们看见,有的选手出现套圈的情况,他跑着跑着追上了跑在他后面的选手,从而在跑步中相遇。我们实现链表带环使用了相似原理
实现链表带环,要用到快慢指针
可以定义两个指针,一个慢指针slow,一个快指针fast,慢指针一次走一步,快指针一次走两步
slow,fast同时从起始节点开始走,如上图,在环中他两会相遇,fast,slow先走L步到入环节点E,fast指针先出环,即在慢指针入环不久后与快指针相遇,在最差情况下快指针和慢指针间距为步长L,之后快指针和慢指针每走一次间距缩小一格,直至相遇
b.那为什么在最差情况下快指针和慢指针间距为步长L呢?
这里涉及一个证明,感兴趣的朋友可以看一看,如下
证明:
其中M点是起始位置,E点是入环节点,N是相遇点,我们在假设环长为R.相遇点N和入环节点E相离R-X.
我们已经知道慢指针入环的时候快指针已经走了n圈,根据这点可以推出
慢指针:L+x
快指针:L+nR+x
2*慢指针 = 快指针
2*(L+x)= L+nR+x
L = R- X
得证
c.1从前面我们知道实现链表带环,要用到快慢指针。慢指针一次走一步,快指针一次走两步。那慢指针一次走一步,快指针一次走两步,三步......N步可以吗?
带环链表慢指针一次走1步,快指针一次走3步
还是快指针先进环,慢指针走的时候快指针套了慢指针一圈,她两永远不会相遇。即使是套圈,快慢指针依然到达相同位置
如下
c.2 带环链表慢指针一次走1步,快指针一次走2步(相遇)
带环链表慢指针一次走1步,快指针一次走3步 (不相遇)
快指针走的步数好像决定是否相遇
通过画图则验证了我的想法,这里稍微做总结吧
带环链表慢指针一次走1步,快指针一次走偶数步,必定相遇
带环链表慢指针一次走1步,快指针一次走奇数步,不相遇,是一定不相遇吗?
在分情况讨论呗
情况1:快指针再走偶数步:相遇
情况2:快指针再走奇数步:不会相遇