Create a Circular Singly Linked List in DSA C# - Time & Space Complexity
We want to understand how long it takes to build a circular singly linked list as we add more items.
How does the time needed grow when the list gets bigger?
Analyze the time complexity of the following code snippet.
public class Node {
public int Data;
public Node Next;
public Node(int data) {
Data = data;
Next = null;
}
}
public class CircularSinglyLinkedList {
public Node Tail;
public void Add(int data) {
Node newNode = new Node(data);
if (Tail == null) {
Tail = newNode;
Tail.Next = Tail; // points to itself
} else {
newNode.Next = Tail.Next;
Tail.Next = newNode;
Tail = newNode;
}
}
}
This code adds a new node to a circular singly linked list, updating pointers to keep the list circular.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Adding a node involves only a few pointer changes, no loops or recursion.
- How many times: Each Add call does a fixed number of steps regardless of list size.
Each time we add a node, the steps stay the same, no matter how big the list is.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 pointer changes |
| 100 | About 4 pointer changes |
| 1000 | About 4 pointer changes |
Pattern observation: The work to add one node stays constant as the list grows.
Time Complexity: O(1)
This means adding a node takes the same small amount of time no matter how many nodes are already in the list.
[X] Wrong: "Adding a node takes longer as the list grows because we have to find the end."
[OK] Correct: We keep a reference to the tail node, so we don't search the list; adding is always quick.
Knowing how to build and add to circular linked lists quickly shows you understand pointers and efficient data structure updates.
"What if we did not keep a tail pointer and only had a head pointer? How would the time complexity change?"
Practice
Solution
Step 1: Understand the node connection in a regular singly linked list
In a regular singly linked list, the last node's next pointer is null, marking the end.Step 2: Understand the node connection in a circular singly linked list
In a circular singly linked list, the last node's next pointer points back to the first node, forming a circle.Final Answer:
The last node points back to the first node in a circular singly linked list. -> Option CQuick Check:
Last node next = first node in circular list [OK]
- Thinking last node points to null in circular list
- Confusing circular with doubly linked list
- Assuming nodes have two pointers in circular singly linked list
Solution
Step 1: Create a new node with value 5
Node head = new Node(5); creates a node with data 5.Step 2: Point the node's next to itself to form a circular link
head.next = head; makes the list circular with one node.Final Answer:
Node head = new Node(5); head.next = head; -> Option AQuick Check:
Single node next points to itself [OK]
- Setting next to null instead of self
- Assigning null to head after creation
- Trying to set next on a null head
class Node {
public int data;
public Node next;
public Node(int d) { data = d; next = null; }
}
Node head = new Node(1);
Node second = new Node(2);
Node third = new Node(3);
head.next = second;
second.next = third;
third.next = head; // circular link
Node temp = head;
do {
Console.Write(temp.data + " -> ");
temp = temp.next;
} while (temp != head);
Console.WriteLine("null");Solution
Step 1: Create nodes and link them circularly
Nodes 1, 2, 3 are linked so that third.next points back to head, forming a circle.Step 2: Traverse and print nodes once using do-while loop
The loop prints data starting at head and stops when temp returns to head, printing 1, 2, 3 once.Final Answer:
1 -> 2 -> 3 -> null -> Option DQuick Check:
Loop prints each node once before stopping [OK]
- Using while loop without do causes skipping first node
- Printing nodes infinitely without stop condition
- Confusing circular list with linear list output
Node newNode = new Node(4);
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = newNode;
newNode.next = head;Solution
Step 1: Understand circular list's last node pointer
In a circular singly linked list, the last node's next points to head, never null.Step 2: Correct the loop condition to find last node
The loop should check temp.next != head to stop at the last node, not temp.next != null.Final Answer:
The while loop condition should check for temp.next != head, not null. -> Option BQuick Check:
Last node next = head, not null [OK]
- Using null check in circular list traversal
- Setting newNode.next to null breaking circularity
- Initializing temp incorrectly
public Node CreateCircularList(int[] arr) {
if (arr.Length == 0) return null;
Node head = new Node(arr[0]);
Node current = head;
for (int i = 1; i < arr.Length; i++) {
current.next = new Node(arr[i]);
current = current.next;
}
// What should be here?
}Solution
Step 1: Create nodes from array and link linearly
Loop creates nodes for each array element and links them in order.Step 2: Make the list circular by linking last node to head
Setting current.next = head closes the loop, making the list circular.Step 3: Return the head node
Return head to provide access to the circular list.Final Answer:
current.next = head; return head; -> Option AQuick Check:
Last node points to head to form circle [OK]
- Leaving last node next as null
- Returning last node instead of head
- Linking head.next to last node instead of last.next to head
Ready to prove it?
Pass the test and this pattern moves unknown
