题目:判断链表是否存在环
思路:定义快慢指针,如果两个指针相遇则一定存在环。
1 public bool IsCircled(Node First) 2 { 3 if (First == null || First.Next == null) 4 { 5 return false; 6 } 7 else 8 { 9 Node slow = First; 10 Node fast = First; 11 while (fast != null && fast.Next != null) 12 { 13 fast = fast.Next.Next; 14 slow = slow.Next; 15 if (slow == fast) 16 { 17 break; 18 } 19 20 } 21 if (fast == null || fast.Next == null) 22 { 23 return false; 24 } 25 else return true; 26 } 27 }
拓展1
求环的长度:
思路:从快慢指针第一次相遇开始计数,再次相遇时停止计数。
1 public int GetloopLength(Node First) 2 { 3 if (First == null && First.Next == null) return 0; 4 else 5 { 6 Node slow = First; 7 Node fast = First; 8 int length = 0; 9 bool start = false; 10 bool again = false; 11 while (fast != null && fast.Next != null) 12 { 13 fast = fast.Next.Next; 14 slow = slow.Next; 15 if (fast == slow && again == true) 16 { 17 break; 18 } 19 if (fast == slow && again == false) 20 { 21 start = true; 22 again = true; 23 } 24 if (start == true) 25 { 26 length++; 27 } 28 } 29 return length; 30 } 31 }
拓展2
求环的入口:
思路:头结点到入口点的距离=链表总长-环长
1 public Node FindLoopEntrance(Node First) 2 { 3 if (First == null || First.Next == null) return null; 4 else 5 { 6 int sumLength = 0; 7 int loopLength = 0; 8 Node slow = First; 9 Node fast = First; 10 bool start = false; 11 bool again = false; 12 13 while (fast != null && fast.Next != null) 14 { 15 fast = fast.Next.Next; 16 slow = slow.Next; 17 if (fast == slow && again == true) break; 18 if (fast == slow && again == false) 19 { 20 start = true; 21 again = true; 22 } 23 if (start == true) loopLength++; 24 sumLength++; 25 } 26 int indexOfEntrance = sumLength - 2 * loopLength; 27 int i = 0; 28 Node entrance = First; 29 while (entrance.Next != null) 30 { 31 if (indexOfEntrance == i) break; 32 entrance = entrance.Next; 33 i++; 34 } 35 return entrance; 36 } 37 }