Reverse Sublist of a Linked List - codepath/compsci_guides GitHub Wiki
Unit 6 Session 2 (Click for link to problem statements)
Problem Highlights
- 💡 Difficulty: Medium
- ⏰ Time to complete: 30 mins
- 🛠️ Topics: Linked Lists, Reverse Operations
1: U-nderstand
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?
- Q: What happens if
m
andn
are the same?- A: No change is made to the list since the range to reverse is only one node.
HAPPY CASE
Input: 1 -> 2 -> 3 -> 4 -> 5, m = 2, n = 4
Output: 1 -> 4 -> 3 -> 2 -> 5
Explanation: Nodes between position 2 and 4 are reversed, leading to the sequence 4 -> 3 -> 2.
EDGE CASE
Input: 1 -> 2 -> 3, m = 1, n = 1
Output: 1 -> 2 -> 3
Explanation: As m and n are the same, no nodes are reversed, and the list remains unchanged.
2: M-atch
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.
This problem is a variation of the classic linked list reversal but with a constraint to only reverse a subsection of the list.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use a temporary node to simplify edge cases and use pointers to reverse the specified section.
1) Create a temp node to simplify operations at the head.
2) Use pointers to navigate to the start of the section to reverse.
3) Reverse the nodes between m and n using pointer manipulation.
4) Connect the reversed section back into the list.
⚠️ Common Mistakes
- Failing to reconnect the reversed section properly with the rest of the list.
- Not handling the case where the reverse starts from the head node.
4: I-mplement
Implement the code to solve the algorithm.
def reverse_between(head, m, n):
if not head or m == n:
return head
# Create a temporary head node to simplify edge cases where m is 1
temp_head = Node(0)
temp_head.next = head
prev = temp_head
# Step 1: Reach the node just before position m
for i in range(m - 1):
prev = prev.next
# `prev` now is the node just before m, and `start` will be the first node to reverse
start = prev.next
then = start.next
# Step 2: Reverse from m to n
for _ in range(n - m):
start.next = then.next # Remove `then` from the list
then.next = prev.next # Insert `then` at the beginning of the reversed section
prev.next = then # Move `prev` to point to `then` as the new start of the reversed section
then = start.next # Move `then` to the next node to be reversed
return temp_head.next
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Run through the code with a typical example to ensure that the section is reversed and properly linked.
- Check with the edge case where m and n are the same to confirm no unnecessary changes are made.
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
- Time Complexity:
O(N)
since we might need to traverse the entire list in the worst case. - Space Complexity:
O(1)
as we are using a constant amount of space regardless of the input size.