【Java】给定一个有环链表,实现算法返回环路的开头结点
2015-07-09 15:34
579 查看
假设链表有一部分是环路,一部分不是,环路起始处距离链表表头有K个结点
1. 创建两个指针:FastRunner 和 SlowRunner
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步之后,而新的碰撞出就是环路的起始结点。然后返回新的碰撞处。
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步之后,而新的碰撞出就是环路的起始结点。然后返回新的碰撞处。
相关文章推荐
- java新框架JFinal来啦!你还是只知道SSH框架吗?
- 论java虚拟类和接口的区别
- 接口 抽象类
- java加密技术
- java加密技术
- myeclipse6.5版本注册码
- 【转载】eclipse中批量修改Java类文件中引入的package包路径
- Java(JVM运行时)各种内存区域详解及扩展
- java内存管理
- Java语言的动态性支持(二)reflection反射
- Eclipse 的Code Template设置
- Java语言的动态性支持(一)ScriptEngineManager
- Struts 标签在JSP中运用
- java.lang.InstantiationException:no empty constructor解决方法
- 五、CXF 4000 WebService整合Spring
- Java 成员初始化过程
- java 可变参数
- java.lang.IllegalStateException: No activity
- #笔记#圣思园 JavaWeb 第29讲——Servlet
- 重踏学习Java路上_Day22(数据操作流,内存操作流,打印流,标准输入输出流,随机访问流,合并流,序列化流,Properties,NIO)