链表是否有环题解

  • 投机取巧式解法
    //当链表中有环的情况下,有一个指针指向该链表,可以一直循环走下去
    //除以 100000 是为了刚好可以在指定时间内结束,不然报错
    public class Solution {
      public boolean hasCycle(ListNode head) {
          if (head == null || head.next == null || head.next.next == null) return false;
          ListNode node = head;
          for (int i = 0;i < Integer.MAX_VALUE/100000; i++) {
              if (head.next != null) head = head.next;
              else return false;
          }
          return true;
      }
    }
  • 利用链表如果有循环的时候,设置一个快指针,一个 慢指针,快指针总会追上慢指针的特征。
    public class Solution {
      public boolean hasCycle(ListNode head) {
          if (head == null || head.next == null || head.next.next == null) return false;
          ListNode fast = head;
          ListNode slow = head;
          while (fast != null && fast.next != null) {
              fast = fast.next.next;
              slow = slow.next;
              if (fast == slow) return true;
          }
          return false;
      }