java實現---判斷單鏈表是否帶環?若帶環,求環的長度?求環的入口點?
阿新 • • 發佈:2019-01-01
判斷
單鏈表是否帶環
- 判斷一個連結串列是否帶環
- 我們可以定義兩個快慢節點,快的一次走兩步,慢的一次走一步
- 若連結串列帶環,兩個節點在遍歷的過程中,肯定會在環內相遇
- 如果不帶環,則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;