对于链表中的环,常见面试题目有下面几个:
1.给一个单链表,判断其中是否有环的存在?
思路:采用快慢指针,快指针每次走2,慢指针每次走1,如果在快指针遍历链表结束之前,二者相遇,则说明有环。
2.如果存在环,找出环的入口点?
思路:从链表起点到环的入口点,与从快慢指针相遇点到环的入口点,距离相同。
3.如果存在环,求出环上节点的个数?
思路:1,采用已经进入环中慢指针遍历环,当再次到达遍历起点时所经过的距离就是环的长度 2,采用快慢指针,从快慢指针第一次相遇之后开始遍历,直到它们再次相遇,那么从第一次相遇到再次相遇,所经历的距离就是环的长度,即环上节点的个数。
4.如果存在环,求出链表的长度?
思路:起点到入口点的长度,加上环的长度,就是链表的长度。
5.如果存在环,求出环上距离任意一个节点最远的点(对面节点)?
思路:建立快慢指针,从该点开始遍历环,当快指针再次回到起点时,慢指针所指向的节点就是对面节点。
6.如何判断两个无环链表是否相交?
思路:先算出两个链表的长度差,然后对长链表在长度差的位置处开始遍历,短链表从头开始遍历,如果在遍历结束前两者相遇,则相交。
7.如果相交,求出第一个相交的节点?
思路:借鉴上面的6。