題目:對於一個給定的鏈表,返回環的入口節點,如果沒有環,返回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;
}
}