1.下图为这个表的结构以及问题
2.首先要确定这个链表有没有环
思路的话不难,都知道如果有环的话那么遍历这个链表则是没有结尾的,而且最后面的肯定是重复的,最直接想到的就是穷举法,对于上图个数不多的还好,如果表是特别长的话就蛋疼了,那再换个切入点,上学时都跑过三千米吧,第一能把倒数第一落下几圈,是不是有思路了,就是可以定义快慢两个指针,如果有环的话则快慢指针总会能相遇,否则的话这两个指针永远相遇不了。思路有了下一步就是编码了。
|
|
3.求这个链表的长度
这个思路也很简单,求出那个结环的Node
就可以了,第一反应应该就是上一步的相遇点不就是么,但是再仔细想想是不是感觉不是,有可能是环里面的任何一个元素,那么ok换个思路,还是类比以上的思路,先求出这个环的长度,然后还是两个指针步长相同,先让其中一个指针先走环的长度,然后再让两个一起按照一个步长走,那么碰撞时的相遇点就是要求的Node
|
|
4.总结
查找链表是否有环使用快慢指针比较巧妙,感觉指针游离作比较,源码地址