Create a Circular Singly Linked List in DSA Python - Time & Space Complexity
When creating a circular singly linked list, it is important to understand how the time needed grows as we add more nodes.
We want to know how long it takes to build the list as its size increases.
Analyze the time complexity of the following code snippet.
class Node:
def __init__(self, data):
self.data = data
self.next = None
class CircularSinglyLinkedList:
def __init__(self):
self.head = None
def append(self, data):
new_node = Node(data)
if not self.head:
self.head = new_node
new_node.next = self.head
else:
temp = self.head
while temp.next != self.head:
temp = temp.next
temp.next = new_node
new_node.next = self.head
This code creates a circular singly linked list by adding nodes one by one, linking the last node back to the head.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that finds the last node before the head.
- How many times: It runs once for each node already in the list when appending a new node.
Each time we add a new node, we walk through the list to find the last node.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps to add the last node |
| 100 | About 100 steps to add the last node |
| 1000 | About 1000 steps to add the last node |
Pattern observation: The number of steps grows roughly in a straight line with the number of nodes.
Time Complexity: O(n)
This means adding a new node takes longer as the list grows, because we must find the last node each time.
[X] Wrong: "Appending a node always takes the same time, no matter how big the list is."
[OK] Correct: Because we must walk through all existing nodes to find the last one, the time grows with the list size.
Understanding how adding nodes scales helps you explain trade-offs in linked list operations clearly and confidently.
"What if we kept a reference to the last node? How would the time complexity of appending change?"
Practice
Solution
Step 1: Understand the structure of a circular singly linked list
In a circular singly linked list, the last node's next pointer points back to the first node, creating a loop.Step 2: Compare with other list types
Unlike doubly linked lists, nodes have only one pointer. Unlike arrays, nodes are linked dynamically. The circular nature is unique to this structure where the last node points back to the first node, forming a circle.Final Answer:
The last node points back to the first node, forming a circle. -> Option BQuick Check:
Circular list loops back = C [OK]
- Confusing circular with doubly linked list
- Thinking nodes have two pointers
- Assuming fixed size like arrays
Solution
Step 1: Understand empty list initialization
An empty circular singly linked list has no nodes, so head should be None.Step 2: Analyze other options
head = Node(0); head.next = None sets next to None, which is not circular. head = Node(0); head.next = head creates a node pointing to itself, which is a single-node circular list, not empty. head = [] uses a list, not a linked list.Final Answer:
head = None -> Option AQuick Check:
Empty list head = None [OK]
- Setting head.next to None in empty list
- Creating a node when list is empty
- Using Python list [] instead of nodes
class Node:
def __init__(self, data):
self.data = data
self.next = None
head = Node(1)
second = Node(2)
third = Node(3)
head.next = second
second.next = third
third.next = head
current = head
result = []
for _ in range(4):
result.append(current.data)
current = current.next
print(result)Solution
Step 1: Understand the circular link setup
Nodes 1, 2, 3 are linked in a circle: 1->2->3->1.Step 2: Trace the loop for 4 iterations
Starting at head (1), the loop collects data: 1, then moves to 2, then 3, then back to 1.Final Answer:
[1, 2, 3, 1] -> Option CQuick Check:
Loop of 3 nodes repeated once = [1,2,3,1] [OK]
- Assuming last node points to None
- Stopping after 3 elements instead of 4
- Confusing data values with node references
class Node:
def __init__(self, data):
self.data = data
self.next = None
head = Node(10)
head.next = None # Intended to point to head for circular listSolution
Step 1: Check the pointer assignment for circularity
For a circular singly linked list with one node, the node's next must point to itself (head), not None.Step 2: Analyze the given code
The code sets head.next = None, breaking the circular link.Final Answer:
head.next should point to head, not None -> Option DQuick Check:
Single node circular list loops to itself [OK]
- Setting next to None instead of head
- Confusing singly with doubly linked list
- Thinking data value affects circularity
Solution
Step 1: Locate the last node in the circular list
Traverse nodes until current.next points back to head, identifying the last node.Step 2: Insert new node after last node and link it back to head
Set last node's next to new_node, then new_node's next to head to maintain circularity.Final Answer:
Traverse until current.next != head, then set current.next = new_node and new_node.next = head -> Option AQuick Check:
Traverse till last node, link new node, maintain circle [OK]
- Setting new_node.next to None breaking circularity
- Not traversing to last node correctly
- Assuming head.next is always last node
Ready to prove it?
Pass the test and this pattern moves unknown
