1. 程式人生 > >java實現---判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?

java實現---判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?

判斷

單鏈表是否帶環

  • 判斷一個連結串列是否帶環
  • 我們可以定義兩個快慢節點,快的一次走兩步,慢的一次走一步
  • 若連結串列帶環,兩個節點在遍歷的過程中,肯定會在環內相遇
  • 如果不帶環,則fast會走到空,則迴圈退出
    在這裡插入圖片描述
 public static ListNode HacListCircle(ListNode first){
        ListNode fast = first;
        ListNode slow = first;
        while((fast != null) && (fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow){
                return fast;
            }
        }
        return null;
    }

若帶環,求環的長度

  • 若帶環,則fast與slow兩次相遇之間,slow走過的節點數即為環的長度
 public static  int CircleLength (ListNode first){
        ListNode fast = first;
        ListNode slow = first;
        while((fast != null) && (fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
            while (fast == slow) {
                int len = 1;
                fast = fast.next.next;
                slow = slow.next;
                while(fast != slow){
                    len ++;
                    fast = fast.next.next;
                    slow = slow.next;
                }
                return length;
            }
            }
    }

求環的入口點

  • 如下圖演算法分析

在這裡插入圖片描述

  • 相遇之後,讓fast重回連結串列頭,fast與slow同時一次走一步,當fast==slow時,則它們到了入口點
                  fast = first;
                while(fast != slow){
                    fast = fast.next;
                    slow = slow.next;
                    }
                    return slow;