判斷單鏈表是否是有環
環連結串列是隻連結串列中有環,例如下面:1->2->3->4->5->6->7->8->9->10->4,這樣遍歷的時候4->5->6->7->8->9->10->4就形成一個環路一直迴圈 。有環連結串列跟普通連結串列一樣的,只不過構造資料的時候形成環路 。
例如下圖:

環連結串列.png
思路:
用兩個指標fast和slow指標( 快慢指標 ),開始的時候指標都指向連結串列的Head節點,然後在每一步的操作中slow向前走一步:slow = slow.Next,
而fast就向前走兩步 :fast = fast.Next.Next;
快指標fast由於比慢指標slow快,所以fast一定比slow先進入環

3.png
fast = fast.Next.Next; slow = slow.Next;
也就是說,slow每次向前走一步,fast向前追了兩步,因此每一步操作後fast到slow的距離縮短了1步,這樣繼續下去就會使得兩者之間的距離逐漸減小,最後會在環中相遇;
複雜度:
時間複雜度 :需要迴圈N次,所以時間複雜度未O(n);
空間複雜度 :除了連結串列本身需要的記憶體空間外,並不需要其他的記憶體空間地址,所以空間複雜度為O(1);
完整程式碼(自測是OK的):
public bool CycleList() { //連結串列為空,或是單結點連結串列只有一個節點 if (Head == null || Head.Next == null) { return false; } Node<T> temp = Head; Node<T> fast = temp; Node<T> slow = temp; while (fast.Next != null && fast.Next.Next != null)//當快指標與慢指標相遇時 { fast = fast.Next.Next; slow = slow.Next; if (slow == fast) { return true; } } return false; }