给定一个链表的头节点
head
,返回链表开始入环的第一个节点。 如果链表无环,则返回null
。142. 环形链表 II - 力扣(LeetCode)(代码在最后)
问题分析:
一共分为两部分:
- A:先判断链表是否有环
- B: 找环的入口
// 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回null
public ListNode EntryNodeOfLoop(ListNode head) {
//先判断链表是否为空
if(head == null){
return null;
}
//先让fast和slow都指向链表的头
ListNode fast = head;
ListNode slow = head;
//下面两个条件不能换位置,不然会出现空指针异常的问题
while(fast != null && fast.next != null ){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){//当该条件成立时,说明fast和slow相遇了
break;//链表有环,这个时候跳出循环
}
}
//上面循环走完到这里会有两种情况,一种是因为链表无环,一种是链表有环
if(fast == null || fast.next == null){//当链表无环的时候
return null;
}
//走到这里的时候fast==slow了,说明链表有环
slow = head;
while(slow != fast){//让slow从头走,fast从相遇走直到相遇
slow = slow.next;
fast = fast.next;
}
//走到这里的时候fast和slow都指向了入口节点,随便返回哪一个都行
return slow;
}