快慢指针算法
参考:
https://blog.****.net/qq_30193419/article/details/93596329
https://blog.****.net/u010292561/article/details/80444057
1.寻找中间位置(链表)
先一遍遍历总长度,然后折半,再这个遍历至中间位置。
**快慢指针算法:**引入两个指针,快的一次移动两个,慢的一次移动一个,快的到终点,慢的到中间。一次遍历完成。
当然,需要考虑奇偶的情况。
比较: 快慢指针算法省下了从头再次到中间的时间。
2.找链表的倒数第k个节点
一般思路:先到终点,然后倒着找第k个。
**快慢指针算法:**引入两个指针,快的先移动k个单位,快的和慢的均一次移动1个单位,快的到终点,慢的到达倒数第k个。一次遍历完成。
比较: 快慢指针算法省下了从尾部再次走k步的时间。
3.检测单链表是否有环,返回环的入口。
相关例题:
1.判断是否存在环:
引入两个指针,快的一次移动两个,慢的一次移动一个,最终存在相等,则有。
2.※求环的入口:
易得:两指针相遇时,快指针走过的路程为慢指针的2倍。
a+nr+b=2(a+b)(慢的也可能多次绕环,但可以抵消,a+nr+b=2(a+b)+mr)
a=nr-b
a=(n-1)r+r-b
一个慢指针slower1从链表头出发,1个慢指针slower2从b点出发,slower1走到环入口时(路程为a),slower也刚好走到环入口(路程为(n-1)r+r-b:n-1个整圈加上r-b的路程)