Delete Node at End in DSA C# - Time & Space Complexity
We want to understand how long it takes to remove the last item from a linked list.
How does the time needed change when the list gets bigger?
Analyze the time complexity of the following code snippet.
public void DeleteAtEnd()
{
if (head == null) return;
if (head.next == null) {
head = null;
return;
}
Node current = head;
while (current.next.next != null) {
current = current.next;
}
current.next = null;
}
This code removes the last node from a singly linked list by walking to the second last node and cutting off the last one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that moves through nodes to find the second last node.
- How many times: It runs once for each node except the last two, so roughly n-2 times for a list of size n.
As the list grows, the loop runs more times because it must reach near the end.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 8 times through the loop |
| 100 | About 98 times through the loop |
| 1000 | About 998 times through the loop |
Pattern observation: The number of steps grows roughly the same as the list size.
Time Complexity: O(n)
This means the time to delete the last node grows linearly with the list size.
[X] Wrong: "Deleting the last node is always fast and takes constant time."
[OK] Correct: Because we must find the node before the last one, which takes time proportional to the list length.
Understanding this helps you explain how linked lists work and why some operations take longer as the list grows.
"What if the list had a tail pointer that points directly to the last node? How would the time complexity change?"
Practice
Delete Node at End do in a singly linked list?Solution
Step 1: Understand the operation meaning
Deleting a node at the end means removing the last node in the linked list.Step 2: Compare options with operation
Only Removes the last node from the list matches removing the last node; others add or remove nodes elsewhere.Final Answer:
Removes the last node from the list -> Option CQuick Check:
Delete Node at End = Remove last node [OK]
- Confusing delete at end with delete at beginning
- Thinking it adds a node instead of removing
- Assuming it deletes a middle node
Solution
Step 1: Identify correct deletion method
To delete last node, we must reach second last node and set its next pointer to null.Step 2: Check options for this logic
Traverse to second last node, set its next to null matches this logic; others do unrelated actions.Final Answer:
Traverse to second last node, set its next to null -> Option DQuick Check:
Delete last node = second last node next = null [OK]
- Setting head to null deletes whole list
- Trying to set last node's next to head causes cycle
- Creating new node does not delete existing node
Solution
Step 1: Identify last node in list
The last node is 40 in the list 10 -> 20 -> 30 -> 40 -> null.Step 2: Remove last node and update list
Deleting last node removes 40, so list becomes 10 -> 20 -> 30 -> null.Final Answer:
10 -> 20 -> 30 -> null -> Option BQuick Check:
Last node 40 removed = 10->20->30->null [OK]
- Not removing last node, list unchanged
- Removing first node instead
- Removing more than one node accidentally
Node current = head;
while(current.next.next != null) {
current = current.next;
}
current.next = null;
What error can occur when this code runs on a list with only one node?Solution
Step 1: Analyze condition for single node list
If list has one node, current.next is null, so current.next.next causes error.Step 2: Identify exception type
Accessing next of null causes NullReferenceException in C#.Final Answer:
NullReferenceException because current.next.next is invalid -> Option AQuick Check:
Single node list causes null.next access error [OK]
- Ignoring null check for single node
- Assuming loop runs safely always
- Thinking it deletes head node
Solution
Step 1: Handle empty and single node cases
If list is empty or has one node, deleting last node returns null (empty list).Step 2: Traverse to second last node and delete last
Loop until current.next.next is null, then set current.next to null to remove last node.Step 3: Return updated head
Return head pointer to updated list.Final Answer:
Code snippet D correctly deletes last node and returns updated list -> Option AQuick Check:
Check null, traverse to second last, set next null [OK]
- Setting current to null does not remove last node
- Assigning current.next to current creates cycle
- Deleting head instead of last node
Ready to prove it?
Pass the test and this pattern moves unknown
