给定一个链表,判断链表中是否有环。
    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达该节点,则链表中存在环
    如果链表中存在环,则返回 true 。 否则,返回 false 。

    解法一:哈希表

    1. public static boolean hasCycle(ListNode head) {
    2. Set<ListNode> seen = new HashSet<ListNode>();
    3. while (head != null) {
    4. if (!seen.add(head)) {
    5. return true;
    6. }
    7. head = head.next;
    8. }
    9. return false;
    10. }

    解法二:双指针

    1. public static boolean hasCycle2(ListNode head) {
    2. if ((head == null) || (head.next == null)) {
    3. return false;
    4. }
    5. ListNode slow = head;
    6. ListNode fast = head.next;
    7. while (slow != fast) {
    8. if ((fast == null) || (fast.next == null)) {
    9. return false;
    10. }
    11. slow = slow.next;
    12. fast = fast.next.next;
    13. }
    14. return true;
    15. }