TIP102 Unit 6 Session 2 Standard (Click for link to problem statements)
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?
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:
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).
⚠️ Common Mistakes
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.
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.
O(N)
because each node is visited exactly once during the traversal.O(1)
because the algorithm uses a constant amount of extra space for pointers.