In this post I will show you how to detect loop in linked list.

We can find the loop in the linked list via **Floyd’s Cycle-Finding Algorithm, **explained **here**.

The algorithm is pretty straightforward:

- We start at the beginning of the linked list with two pointers.
- The first pointer is incremented through each node of the list. The second pointer moves twice as fast, and skips every other node.
- If the linked list contains a loop, these two pointers will eventually meet at the same node, thus indicating that the linked list contains a loop.

.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Algo { public class Node { public Node Next { get; set; } public int Value { get; set; } public Node(int value) { this.Value = value; } } public class LinkedList { private Node _head; public LinkedList() { } public void AppendLast(Node newNode) { if (_head == null) { _head = newNode; } else { Node current = _head; while (current.Next != null) { current = current.Next; } current.Next = newNode; } } public override string ToString() { Node current = _head; StringBuilder builder = new StringBuilder(); while (current != null) { builder.Append(current.Value + "->"); current = current.Next; } return builder.ToString(); } public bool IsCycle() { Node slow = _head; Node fast = _head; while (fast != null && fast.Next != null) { fast = fast.Next.Next; slow = slow.Next; if (slow == fast) return true; } return false; } } class Program { static void Main(string[] args) { LinkedList list = new LinkedList(); list.AppendLast(new Node(10)); list.AppendLast(new Node(20)); list.AppendLast(new Node(30)); Node cycle = new Node(40); list.AppendLast(cycle); list.AppendLast(new Node(60)); list.AppendLast(cycle); if (list.IsCycle()) { Console.WriteLine("Linked List is cyclic as it contains cycle or loop"); } else { Console.WriteLine("LinkedList is not cyclic, no loop or cycle found"); } } } }