Given a linked list, determine if it has a cycle in it.
思路:採用“快慢指針”查檢查鏈表是否含有環。讓一個指針一次走一步,另一個一次走兩步,如果鏈表中含有環,快的指針會再次和慢的指針相遇。
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
// IMPORTANT: Please reset any member data you declared, as
// the same Solution instance will be reused for each test case.
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast)
return true;
}
return false;
}
}
這裏需要注意的一點是算法中循環的條件,這是一個很容易被忽略的細節。
1)因爲fast指針比slow指針走得快,所以只要判斷fast指針是否爲空就好。由於fast指針一次走兩步(走得太快了,就容易跌倒!),fast.next可能已經爲空(當fast爲尾結點時),fast.next.next將會導致NullPointerException異常,所以在while循環中我們要判斷fast.next是否爲空;
2)考慮一個特殊情況,當輸入的鏈表爲空時,算法應該返回false,空鏈表肯定是不含有環的。如果沒有fast != null,也會導致fast.next拋出NullPointerException異常。
TIPS:時刻記着考慮算法的健壯性,當算法的輸入爲null時會怎樣?