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

原创 2015年07月09日 15:34:57
假设链表有一部分是环路,一部分不是,环路起始处距离链表表头有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步之后,而新的碰撞出就是环路的起始结点。然后返回新的碰撞处。



从本质理解C指针的应用(1)

C指针说到底就是一种操作符,所以想要正确的理解C指针,那么最重要的就是莫过于理解操作符了为了理解有些操作符存在的限制,你必须理解左值和右值(左值和右值)之间的区别。这两个术语是多年前由编译器设计者所创...

征服C指针之没想到你是这样的指针

虚地址 现在的机器可牛着呢,基本上都不以真面目面对大家,而是以虚地址来存储程序,当然 这里有些复杂,我只能说的适可而止(涉及操作系统),比如我写了一个打印地址的程序,然后在两个窗口打开(这个应该不难...

9.2链表(六)——给定一个有环链表,实现一个算法返回环路的开头结点

/** * 功能:给定一个有环链表,实现一个算法返回环路的开头结点。 */ /** * 思路:fast的移动速度是slow的两倍。当slow走了k个结点进入环路,fas...

寻找有环链表的环路开头结点

问题:给定一个有环链表,实现一个算法返回环路的开头结点一、检查一个链表是否存在环路...

数据结构与算法分析笔记与总结(java实现)--链表7:含环链表找环入口结点问题

数据结构与算法分析笔记与总结(java实现)--链表7:含环链表找环入口结点问题...

CCI 2.6 寻找有环链表环路的开头节点

给定一个有环链表,实现以算法返回环路的开头结点。 有环链表的定义

Cracking the Coding Interview:: 寻找有环链表的环路起始节点

给定一个有环链表,实现一个算法返回环路的开头节点。 这个问题是由经典面试题-检测链表是否存在环路演变而来。...

3.6 判断两个无环链表是否相交 & 找出相交的第一个结点

1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述 3. 问题分析这两个问题也是非常经典的问题对于第一个问题 : 解法一 : 穷举, 穷举两个链表的各个元素, 判断有没有相同的结点解法...

C语言强化(七)链表相交问题_2 找到无环链表相交结点

上一节聊了判断两个【无环】链表是否相交,那么如果相交,怎么找到相交结点呢?...

C语言强化(七)链表相交问题_5 找到两个有环链表的相交结点

有环链表是否相交我们也可以判断了,剩下的就是获得有环链表相交结点
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java】给定一个有环链表,实现算法返回环路的开头结点
举报原因:
原因补充:

(最多只允许输入30个字)