Linked List Cycle

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時會怎樣?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章