循环链表有两种情况:
1)单链表中终端节点由空指针指向头节点
2)终端节点指向链表中非头节点
下图是第二种情况:
思路:
1)使用快慢两个指针,找到第一次的相遇点,让慢指针留在此处
2)让快指针从头节点以慢指针的速度开始走(此时慢指针进入循环),直到两指针相遇,此时相遇点就是环的入口
代码实现:
public class LinkTest{
ListNode getLoopNode(ListNode head){
if(head==null || head.next==null){
return null;
}
ListNode fast=head;
ListNode slow=head;
while(fast != null && fast.next != null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
fast=head;
while(fast != slow){
fast=fast.next;
slow=slow.next;
}
if(slow == fast){
return slow;
}
}
return null;
}
}