Get Length of Linked List in DSA C - Time & Space Complexity
We want to know how long it takes to find the length of a linked list as the list grows.
The question is: how does the time needed change when the list gets bigger?
Analyze the time complexity of the following code snippet.
int getLength(struct Node* head) {
int count = 0;
struct Node* current = head;
while (current != NULL) {
count++;
current = current->next;
}
return count;
}
This code counts how many nodes are in a linked list by moving through each node one by one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that visits each node once.
- How many times: Exactly once per node in the list, from start to end.
As the list gets longer, the time to count nodes grows directly with the number of nodes.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The steps increase in a straight line as the list size grows.
Time Complexity: O(n)
This means the time to find the length grows directly with the number of nodes in the list.
[X] Wrong: "The length can be found instantly without checking nodes."
[OK] Correct: Because a linked list does not store its size, you must visit each node to count them.
Understanding this helps you explain how simple operations on linked lists work and shows you can analyze basic loops well.
"What if the linked list stored its length as a variable updated on insertions and deletions? How would the time complexity change?"
Practice
Solution
Step 1: Understand the linked list traversal
The function starts at the head node and moves through each node until it reaches the end (null).Step 2: Count each node visited
Each time the function moves to the next node, it increases a counter by one.Final Answer:
Counts the number of nodes by traversing from head to end -> Option DQuick Check:
Length = number of nodes visited [OK]
- Confusing length with maximum value
- Trying to reverse the list instead
- Not traversing all nodes
head?Solution
Step 1: Recall pointer declaration in C
To declare a pointer to a struct Node, usestruct Node* variableName;.Step 2: Match with options
struct Node* head; correctly declaresheadas a pointer tostruct Node.Final Answer:
struct Node* head; -> Option AQuick Check:
Pointer syntax uses * after type [OK]
- Forgetting the * for pointer
- Using & which is reference in C++ not C
- Incorrect order of * and variable name
struct Node {
int data;
struct Node* next;
};
int getLength(struct Node* head) {
int count = 0;
while (head != NULL) {
count++;
head = head->next;
}
return count;
}
int main() {
struct Node n3 = {30, NULL};
struct Node n2 = {20, &n3};
struct Node n1 = {10, &n2};
printf("%d", getLength(&n1));
return 0;
}Solution
Step 1: Analyze linked list nodes
There are three nodes: n1 -> n2 -> n3 -> NULL.Step 2: Count nodes in getLength function
The function counts each node until it reaches NULL, so count = 3.Final Answer:
3 -> Option AQuick Check:
3 nodes counted from head to end [OK]
- Counting only head node
- Off-by-one error in counting
- Confusing pointer addresses with count
int getLength(struct Node* head) {
int count = 0;
while (head->next != NULL) {
count++;
head = head->next;
}
return count;
}Solution
Step 1: Understand the loop condition
The loop runs whilehead->next != NULL, so it stops before the last node.Step 2: Check counting logic
Because it stops early, the last node is not counted, so count is one less than actual length.Final Answer:
It misses counting the last node -> Option BQuick Check:
Loop condition excludes last node [OK]
- Using head->next in loop condition
- Not handling empty list (NULL head)
- Incrementing count after loop ends
next pointers forming a cycle (loop). How would you modify the length function to avoid infinite counting?Solution
Step 1: Detect cycle using two pointers
Use Floyd's cycle detection: one pointer moves one step, another moves two steps to find a loop.Step 2: If cycle detected, handle counting carefully
Once a cycle is found, count nodes up to the cycle start to avoid infinite counting.Final Answer:
Use two pointers moving at different speeds to detect a cycle before counting -> Option CQuick Check:
Cycle detection prevents infinite loops [OK]
- Ignoring cycle causes infinite loop
- Stopping count arbitrarily without detection
- Modifying list structure destructively
Ready to prove it?
Pass the test and this pattern moves unknown
