目录
1.当节点个数为偶数个,slow走到中间节点,如果fast为空,则没有环。
2.当节点个数为奇数个,slow走到中间节点,如果fast->next为空,则没有环。
步骤一:求出环内slow与fast相遇节点,当相遇时,相遇节点为fast或者slow
步骤二:创建指针newhead,记录相遇节点的下一个节点,将相遇节点的next置为NULL
步骤三:创建指针curh,curnh,变量counth,countnh,计算两个链表节点个数
思路一、
环形链表求环入口节点
一、判断是否有环
通过快慢指针来判断是否有环。
慢指针为slow,每次走一步。快指针为fast,每次走两步。都从首节点head开始。
1.当节点个数为偶数个,slow走到中间节点,如果fast为空,则没有环。
2.当节点个数为奇数个,slow走到中间节点,如果fast->next为空,则没有环。
3.如果有环,那么slow和fast一定会相遇。
因为每当slow和fast向前走时,距离都会缩进1。slow处在环入口时,与正在环中的fast相距N。
在移动的过程中,N = N-1、(N-1)-1.......1,0,直到N=0,slow和fast相遇。
4.延伸:如果fast每次走三步,四步,n步是否能相遇。
可知,当slow处在环入口节点时,fast在环中,此时相距N。
1. 如果fast走三步,那么差距步为n = 2。
如果N为偶数,那么N能被n除尽,与环的奇偶性无关,N = N - 2、(N-2) - 2 .......2、0,能相遇。
如果N为奇数,N则不能被n除尽,N = N - 2 、(N-2) - 2........1、-1,第一次fast追击上slow时,相距为1。
N不能除尽,则判断是否相遇条件由N,变为fast在环内第一次追上slow之间的距离能否被除尽。
假设环的节点数为C,fast在环内第一次追上slow,则slow与fast相距为C-1,此时判断是否相遇的条件为C-1是奇是偶,如果C-1仍然为奇数,则C-1不能被差距步n=2除尽,无法相遇。如果C-1为偶,则能被n除尽,能相遇。
2.如果fast走四步,差距步n = 3。
可知,当slow处在环入口节点时,fast在环中,此时相距N。