您的位置:首页 > 其它

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

2015-08-03 15:01 381 查看
/**
* 功能:给定一个有环链表,实现一个算法返回环路的开头结点。
*/

/**
* 思路:fast的移动速度是slow的两倍。当slow走了k个结点进入环路,fast已经进入环路k个结点,即fast和slow
* 相距loop_size -k个结点。
*          再走loop_ -k次后,碰撞,此时距离环路起始处k个结点。
*          链表首部与环路起始处均距离环路起始处k个结点。因此,保持其中一个不变,另一个指向链表首部,相会处
*    即为环路起始处。
*
* 算法:
* 1)创建两个指针,fast和slow。
* 2)slow每走一步,fast走两步。
* 3)碰撞时,将slow指向head,fast保持不变。
* 4)相同速度移动fast和slow,一次一步,返回碰撞结点。
* @param head
* @return
*/
public static 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;
}

if( fast== null|| fast. next== null)
return null;

slow= head;
while( slow!= fast){
slow= slow. next;
fast= fast. next;
}

return fast;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: