判斷單向鏈表是否有環(huán),可以采用快指針與慢指針兩個指針的方式來解決。即定義一個快指針fast和一個慢指針slow,使得fast每次跳躍兩個節(jié)點(diǎn),slow每次跳躍一個節(jié)點(diǎn)。如果鏈表沒有環(huán)的話,則slow與fast永遠(yuǎn)不會相遇(這里鏈表至少有兩個節(jié)點(diǎn));如果有環(huán),則fast與slow將會在環(huán)中相遇。判斷出鏈表有環(huán)以后,則需要算出進(jìn)入環(huán)的第一個節(jié)點(diǎn)。在fast與slow第一次相遇后,設(shè)置一個節(jié)點(diǎn)p從鏈表的頭部開始遍歷,每次只遍歷一個節(jié)點(diǎn)。這樣,當(dāng)fast與slow再次相遇時,p所處的位置便是環(huán)的首部。
1.判斷一個單鏈表是否有環(huán).
Public static boolean hasCycle(listNode head) {
boolean flag = false;
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(fast == slow){
flag = true;
break;
}
return flag;
}
2.判斷一個單鏈表中是否有環(huán),若有環(huán),求進(jìn)入環(huán)中的第一個節(jié)點(diǎn).
Public ListNode getFirstNodeInCycle(ListNode head) {
if(head == null) {
return null;
} else {
ListNode fast = head;
ListNode slow = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(fast == slow){
//有環(huán),則返回環(huán)的第一個節(jié)點(diǎn)
slow = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
return null;
}
}