您的位置:首页 > 其它

单链表之链表环的入口结点

2015-10-19 12:43 211 查看
链表环的入口结点:
在《链表头》与《相遇点》分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。

public static Node findLoopPort(Node head){
if(head == null)
return null;
Node fast = head; // 快指针每次前进两步
Node slow = head; // 慢指针每次前进一步

while (fast != null && fast.next != null) {
fast = fast.next.next;//fast走两步
slow = slow.next;//slow走一步
if (fast == slow) { // 相遇,存在环
break;
}
}
if(fast==null||fast.next==null){
return null;
}

//至此,两个节点已经相遇了slow=fast=相遇点
于是,在链表的表头与相遇点分别设置一个指针,每次各走一步,两个指针必定相遇,且相遇的第一点是环的入口。

//表头指针
slow = head;
//此时fast指向相遇点,slow指向链表头
//找最终相遇点(相等),条件就是两个指针不相等。
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
//相遇的地方就是入口点
return slow;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: