1. 程式人生 > 實用技巧 >[面試經典程式設計題] 1 判斷連結串列有環與否

[面試經典程式設計題] 1 判斷連結串列有環與否

題目:判斷連結串列是否有環

題目描述

示例

進階:

你能用 O(1)(即,常量)記憶體解決此問題嗎?

Java程式碼

方法1:快慢指標

/**
 * 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) {
        //判斷只有一個節點的情況
        if(head==null || head.next==null){return false;}

        //不是一個節點或者為空的時候,就執行快慢指標
        ListNode slow = head;
        ListNode quick = head.next;

        //if(head.next==head) {return true;}
        while(slow != quick){
            if(quick==null || quick.next==null) {return false;}
            slow = slow.next;
            quick = quick.next.next;
        }
        //退出while迴圈,即有環
        return true;
        
    }
}

方法2:雜湊表

//方法2 雜湊表
    public boolean hasCycle(ListNode head) {
        //判斷只有一個節點回或者無頭節點的話即無環
        if(head==null || head.next==null) {return false;}
        //雜湊表
        Set<ListNode> set = new HashSet<ListNode>();
        while(head!=null){
            if(set.contains(head)){
                return true;
            }else{
                set.add(head);
            }
            head = head.next;
        }
        return false;
    }
}