题目:对于一个给定的链表,返回环的入口节点,如果没有环,返回null
思路:找到链表中的环中的一个节点(快慢指针相遇处),一个指针从相遇处出发,一个指针从链表头节点出发,相遇处即为链表中环的起始点。
代码:
package com.company;
public class TestNo27 {
static class ListNode{
int val;
ListNode next;
ListNode(int x){
val = x;
next = null;
}
}
public static void main(String[] args) {
ListNode head = new ListNode(9);
head.next = new ListNode(4);
head.next.next = new ListNode(5);
head.next.next.next = new ListNode(7);
head.next.next.next.next = new ListNode(8);
head.next.next.next.next.next = head;
TestNo27 t = new TestNo27();
System.out.println(t.detectCycle(head).val);
}
public ListNode detectCycle(ListNode head) {
if(head == null || head.next == null || head.next.next == null){
return null;
}
ListNode fast = head.next.next;
ListNode slow = head.next;
//进行判断是否有环,找到相遇点
while (fast!=slow){
if(fast.next!=null && fast.next.next != null){
fast = fast.next.next;
slow = slow.next;
}else{
return null;
}
}
fast = head;
while (fast != slow){
fast = fast.next;
slow = slow.next;
}
return fast;
}
}