-
Notifications
You must be signed in to change notification settings - Fork 242
Removing Duplicate Markers
TIP102 Unit 6 Session 2 Standard (Click for link to problem statements)
- 💡 Difficulty: Medium
- ⏰ Time to complete: 20-30 mins
- 🛠️ Topics: Linked Lists, Duplicate Removal, Temporary Head Technique
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Established a set (2-3) of test cases to verify their own solution later.
- Established a set (1-2) of edge cases to verify their solution handles complexities.
- Have fully understood the problem and have no clarifying questions.
- Have you verified any Time/Space Constraints for this problem?
- What does the problem ask for?
- The problem asks to remove all duplicate nodes from a sorted linked list, keeping only the unique nodes.
- What should be returned?
- The function should return the head of the updated linked list with duplicates removed.
HAPPY CASE
Input: trailhead = Node(1, Node(2, Node(3, Node(3, Node(4)))))
Output: 1 -> 2 -> 4
Explanation: The node with value 3 appears twice, so it is removed.
EDGE CASE
Input: trailhead = Node(1, Node(1, Node(1)))
Output: (empty list)
Explanation: All nodes have the same value and are duplicates, so the list becomes empty.
Match what this problem looks like to known categories of problems, e.g. Linked List or Dynamic Programming, and strategies or patterns in those categories.
For Linked List problems involving Duplicate Removal, we want to consider the following approaches:
- Temporary Head Technique: Use a temporary head node to simplify edge cases, such as when the first node has duplicates.
- Pointer Manipulation: Traverse the list and carefully adjust pointers to remove duplicates while maintaining the structure of the list.
Plan the solution with appropriate visualizations and pseudocode.
General Idea: We will traverse the linked list, and whenever we encounter a sequence of nodes with the same value, we will remove all nodes with that value, ensuring only unique values remain.
1) Initialize a temporary head node pointing to the original head of the list.
2) Initialize two pointers: `prev` pointing to the temporary head and `current` pointing to the original head.
3) Traverse the list:
a) If the current node has a duplicate (i.e., `current.value == current.next.value`), skip all nodes with the same value.
b) Update `prev.next` to point to the node after the last duplicate.
c) If the current node has no duplicate, move `prev` to point to `current`.
4) Continue until all nodes have been processed.
5) Return the node next to the temporary head (the new head of the list).
- Forgetting to handle cases where the first node or the entire list consists of duplicates.
- Incorrectly managing pointers, leading to loss of nodes or incorrect list structure.
Implement the code to solve the algorithm.
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
# Function to remove duplicates from a sorted linked list
def remove_duplicate_markers(trailhead):
temp_head = Node(0) # Temporary temp head node
temp_head.next = trailhead
prev = temp_head # Pointer to the node before the current sequence
current = trailhead
while current:
# Check if current node has a duplicate
if current.next and current.value == current.next.value:
# Skip all nodes with the same value
while current.next and current.value == current.next.value:
current = current.next
# Link prev to the node after the last duplicate
prev.next = current.next
else:
# Move prev pointer to the current node
prev = prev.next
current = current.next # Move current pointer to the next node
return temp_head.next
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
-
Example: Use the provided
trailhead
linked list to verify that the function correctly removes duplicate nodes.
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
Assume N
represents the number of nodes in the linked list.
-
Time Complexity:
O(N)
because each node is visited exactly once during the traversal. -
Space Complexity:
O(1)
because the algorithm uses a constant amount of extra space for pointers.