LinkedList usage in C Sharp (C#) - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using a linked list, it's important to know how the time to do tasks changes as the list grows.
We want to find out how fast operations like adding or searching run when the list gets bigger.
Analyze the time complexity of the following code snippet.
LinkedList<int> list = new LinkedList<int>();
for (int i = 0; i < n; i++)
{
list.AddLast(i); // Add item at the end
}
bool found = false;
foreach (int item in list)
{
if (item == target)
{
found = true;
break;
}
}
This code adds n items to a linked list, then searches for a target value by checking each item one by one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Adding items in a loop and searching through the list.
- How many times: Adding runs n times; searching can run up to n times in the worst case.
Explain the growth pattern intuitively.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 adds + up to 10 checks |
| 100 | About 100 adds + up to 100 checks |
| 1000 | About 1000 adds + up to 1000 checks |
Pattern observation: The work grows directly with the number of items; doubling n roughly doubles the work.
Time Complexity: O(n)
This means the time to add and search grows in a straight line with the number of items.
[X] Wrong: "Searching a linked list is as fast as accessing an array element by index."
[OK] Correct: Linked lists do not allow direct access by position, so searching requires checking each item one by one, which takes longer as the list grows.
Understanding how linked lists work and their time costs helps you choose the right tool for the job and explain your choices clearly in interviews.
"What if we changed the search to use a Dictionary instead of a LinkedList? How would the time complexity change?"
Practice
LinkedList in C#?Solution
Step 1: Understand LinkedList structure
A LinkedList stores elements in nodes, where each node points to the next (and possibly previous) node.Step 2: Compare options with LinkedList behavior
Only It stores elements in nodes linked by references. correctly describes this linked node structure; others describe arrays or incorrect behaviors.Final Answer:
It stores elements in nodes linked by references. -> Option AQuick Check:
LinkedList = nodes linked by references [OK]
- Thinking LinkedList uses arrays internally
- Assuming LinkedList only adds at the end
- Believing LinkedList cannot remove elements
LinkedList<int> named list?Solution
Step 1: Recall LinkedList method names
The method to add an element at the start isAddFirst.Step 2: Check each option's validity
OnlyAddFirstis a valid LinkedList method; others are invalid or do not exist.Final Answer:
list.AddFirst(10); -> Option BQuick Check:
AddFirst adds at start [OK]
- Using non-existent methods like AddStart or PushFront
- Confusing LinkedList with List methods
- Trying to use InsertAt which LinkedList does not have
var list = new LinkedList<string>();
list.AddLast("apple");
list.AddFirst("banana");
list.AddLast("cherry");
foreach(var item in list) Console.Write(item + " ");Solution
Step 1: Track insertion order
First, "apple" is added last, so list: apple. Then "banana" added first, so list: banana, apple. Then "cherry" added last, so list: banana, apple, cherry.Step 2: Understand foreach iteration order
Foreach iterates from first to last node, so output is "banana apple cherry ".Final Answer:
banana apple cherry -> Option AQuick Check:
First = banana, last = cherry [OK]
- Assuming AddLast adds at start
- Confusing order of AddFirst and AddLast
- Expecting output in reverse order
var list = new LinkedList<int>(); list.AddFirst(1); list.AddLast(2); list.Remove(3); Console.WriteLine(list.Count);
Solution
Step 1: Understand Remove behavior
Remove(value) tries to remove the first node with that value. If not found, it does nothing and returns false; no exception is thrown.Step 2: Check Count after removal attempt
Since 3 is not in the list, list remains with 2 elements; Count is 2.Final Answer:
Remove(3) does nothing since 3 is not found; Count remains 2. -> Option DQuick Check:
Remove missing value = no error, Count unchanged [OK]
- Expecting Remove to throw exception if item missing
- Thinking AddFirst/AddLast are invalid
- Assuming Count is not a property
LinkedList<int> with values 1, 2, 3, 4, 5, which code snippet correctly removes all even numbers from the list?Solution
Step 1: Understand safe removal during iteration
Removing nodes while iterating requires storing next node before removal to avoid invalid references.Step 2: Analyze each option
foreach(var node in list) { if(node % 2 == 0) list.Remove(node); } uses foreach which throws error on modification during iteration. var current = list.First; while(current != null) { var next = current.Next; if(current.Value % 2 == 0) list.Remove(current); current = next; } correctly uses a while loop with next node saved. for(int i = 0; i < list.Count; i++) { if(list.ElementAt(i) % 2 == 0) list.Remove(list.ElementAt(i)); } uses ElementAt which is inefficient and unsafe. list.RemoveAll(x => x % 2 == 0); is invalid as LinkedList has no RemoveAll method.Final Answer:
var current = list.First; while(current != null) { var next = current.Next; if(current.Value % 2 == 0) list.Remove(current); current = next; } -> Option CQuick Check:
Use while loop with next saved to remove nodes safely [OK]
- Modifying list inside foreach causes runtime error
- Using RemoveAll which LinkedList does not have
- Using ElementAt which is inefficient and unsafe
