Java:倘若一个链表有环,如何找到环的入口

来源:互联网 发布:刘备对诸葛亮说知我者 编辑:程序博客网 时间:2024/05/01 03:02

如果单链表有环,按照判断是否有环的思路,当快指针和慢指针相遇时,slow指针肯定没有遍历完链表,而fast指针已经在环内循环了n圈。假设slow指针走了s步,则fast指针走了2*s步,设环长为r,则:

2*s=s+n*r;

s=n*r;

设链表头到环入口距离为l,入口处距离相遇点距离为a,则:

s=l+a+mr;

得:l=(n-m)r - a

可见,相遇后,如果在链表头和相遇点各设置一个指针,每次走一步,两指针必定相遇,且在相遇第一个点为环入口。


public class findloopport {public Node method(Node head) {Node slow=head,fast=head;while(fast!=null&&fast.next!=null) {slow=slow.next;fast=fast.next.next;if(fast==slow) {break;}}if(fast==null||fast.next==null) {return null;}slow=head;while(slow!=fast) {slow=slow.next;fast=fast.next;}return fast;}}


阅读全文
0 0
原创粉丝点击