关闭

【Java】给定一个有环链表,实现算法返回环路的开头结点

947人阅读 评论(0) 收藏 举报
分类:
假设链表有一部分是环路,一部分不是,环路起始处距离链表表头有K个结点
1. 创建两个指针:FastRunner 和 SlowRunner
public class FindLoopBegining {
	public LinkedListNode FindBeginging(LinkedListNode head){
		LinkedListNode slow = head;
		LinkedListNode fast = head;
		
		while( fast != null && fast.next!= null ) {
			slow = slow.next;
			fast = fast.next.next;
			if (slow == fast) {
				break;
			}
		}
		
		//no collision, no loop
		if (fast == null || fast.next == null) {
			return null;
		}
		
		//slow points to head, fast points to collision spot, 两者以相同速度移动,则必定会碰撞在环路开始处
		slow = head;
		while (slow != fast) {
			slow = slow.next;
			fast = fast.next;
		}
		
		return fast;
	}

}


2. SlowRunner 每走一步, FastRunner走两步,则当SlowRunner进入环路时,FastRunner已经进入环路K个结点后,且这时他们相距LOOP_SIZE-K的结点;此时,SlowRunner每走一个结点,FastRunner就每走两个结点,由于这是一个环路,所以每走一次两者的距离就会更近一个结点。因此在走了LOOP_SIZE-K个结点后两者会碰在一起,而且这时他们距离环路起始处刚好有K个结点。
3. 两者碰在一起时,他们距离环路起始处还有K个结点,将SlowRunner指向LinkedListHead, FastRunner保持不变,这时SlowRunner和FastRunner距离环路起始处均有K个结点

4. 以相同速度移动SlowRunner和FastRunner,一次一步,这两个指针会在此碰到一起,这是在K步之后,而新的碰撞出就是环路的起始结点。然后返回新的碰撞处。



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:128200次
    • 积分:3177
    • 等级:
    • 排名:第11273名
    • 原创:180篇
    • 转载:107篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论