/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
//先获取快慢指针在环中的相遇节点
ListNode front = inLoop(head);
ListNode back = head;
//如果没有环相遇节点为null,不必再接着判断
if(front == null){
return null;
}
//两个指针以同样的速度走直到相遇返回节点,该节点就是两者环的入口节点
while(front != back){
front = front.next;
back = back.next;
}
return back;
}
//获取环中快慢指针相遇的节点
public ListNode inLoop(ListNode head){
if(head == null || head.next == null){
return null;
}
//初始化快慢指针
ListNode slow = head.next;
ListNode fast = slow.next;
//两者走直到有一个为null或者,两者相遇则返回
while(slow != null && fast != null){
if(slow == fast){
return slow;
}
slow = slow.next;
fast = fast.next;
if(fast != null){
fast = fast.next;
}
}
return null;
}
}
链表中环的入口节点java实现
最新推荐文章于 2022-05-13 19:35:15 发布