📖 Scenario: You are working on a music playlist app. The playlist is a linked list where each node holds a song's name. Sometimes, users want to remove a song counting from the end of the playlist. Your task is to remove the nth song from the end of the playlist.
🎯 Goal: Build a program that creates a linked list of songs, then removes the nth node from the end of the list, and finally prints the updated playlist.
📋 What You'll Learn
Create a singly linked list with exact song names in order
Create an integer variable n representing the position from the end
Implement logic to remove the nth node from the end of the linked list
Print the updated linked list showing song names separated by ' -> ' and ending with 'null'
💡 Why This Matters
🌍 Real World
Removing the nth node from the end of a linked list is useful in applications like music playlists, task queues, or browsing history where you want to delete items counting from the end.
💼 Career
Understanding linked list manipulation and two-pointer techniques is important for software engineering roles that involve data structure optimization and algorithmic problem solving.
Progress0 / 4 steps
1
Create the linked list of songs
Create a singly linked list with the class ListNode where each node has a string val and a ListNode next. Then create the linked list with these exact songs in order: "SongA", "SongB", "SongC", "SongD", "SongE". Store the head node in a variable called head.
DSA C#
Hint
Define the ListNode class first. Then link nodes one by one to form the list.
2
Set the position n from the end
Create an integer variable called n and set it to 2. This means you want to remove the 2nd song from the end of the playlist.
DSA C#
Hint
Just create a variable n and assign it the value 2.
3
Remove the nth node from the end
Write code to remove the nth node from the end of the linked list. Use two pointers: first and second, both starting at a dummy node before head. Move first ahead by n + 1 steps, then move both pointers until first reaches the end. Then remove the node after second. Update head to dummy.next.
DSA C#
Hint
Use a dummy node before head to handle edge cases. Move first pointer n+1 steps ahead, then move both pointers until first reaches the end. Remove the node after second.
4
Print the updated playlist
Write code to print the updated linked list starting from head. Print each song's name followed by " -> ". After the last song, print "null".
DSA C#
Hint
Use a loop to go through each node starting from head. Print the song name followed by ' -> '. After the loop, print 'null'.
Practice
(1/5)
1. What does the problem Remove Nth Node from End of List ask you to do?
easy
A. Delete the node that is the nth from the end in a linked list
B. Add a new node at the nth position from the start
C. Reverse the linked list
D. Find the value of the nth node from the start
Solution
Step 1: Understand the problem statement
The problem asks to remove the node that is nth from the end of a singly linked list.
Step 2: Clarify what removal means
Removal means unlinking that node so the list skips it, keeping the rest intact.
Final Answer:
Delete the node that is the nth from the end in a linked list -> Option A
Quick Check:
Remove nth from end = Delete nth from end [OK]
Hint: Focus on 'remove nth from end' means delete that node [OK]
Common Mistakes:
Confusing nth from end with nth from start
Thinking it means reversing the list
Trying to find value instead of removing node
2. Which of the following C# code snippets correctly declares a singly linked list node class for this problem?
easy
A. public class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } }
B. class Node { int val; Node next; Node(int x) { val = x; next = null; } }
C. public struct ListNode { public int val; public ListNode next; }
D. public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; next = null; } }
Solution
Step 1: Check for public access modifiers
public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; next = null; } } uses public class and public members, which is correct for external access.
Step 2: Verify constructor and member initialization
public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; next = null; } } correctly initializes val and next in constructor; others miss public or use struct incorrectly.
Final Answer:
public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; next = null; } } -> Option D
Quick Check:
Proper class with public members = public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; next = null; } } [OK]
Hint: Use public class and public members for linked list nodes [OK]
Common Mistakes:
Missing public keyword causing access errors
Using struct instead of class for linked list node
Not initializing next to null in constructor
3. What will be the output linked list after removing the 2nd node from the end in the list: 1 -> 2 -> 3 -> 4 -> 5 -> null?
medium
A. 1 -> 3 -> 4 -> 5 -> null
B. 1 -> 2 -> 4 -> 5 -> null
C. 1 -> 2 -> 3 -> 5 -> null
D. 2 -> 3 -> 4 -> 5 -> null
Solution
Step 1: Identify the 2nd node from the end
The list is 1->2->3->4->5. Counting from end: 5 (1st), 4 (2nd). So node with value 4 is to be removed.
Step 2: Remove node with value 4
Link node 3's next to node 5, skipping node 4. Result: 1->2->3->5->null.
Final Answer:
1 -> 2 -> 3 -> 5 -> null -> Option C
Quick Check:
Remove 2nd from end (4) = 1->2->3->5 [OK]
Hint: Count from end to find node, then skip it [OK]
Common Mistakes:
Removing the wrong node counting from start
Removing node with value 3 instead of 4
Not updating links correctly causing broken list
4. Given the following code snippet to remove the nth node from end, what is the bug?
public ListNode RemoveNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
for (int i = 0; i < n; i++) {
fast = fast.next;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
medium
A. Does not handle case when fast becomes null after initial loop
B. Uses slow pointer incorrectly by moving it too early
C. Returns slow instead of head
D. Does not update fast pointer inside the loop
Solution
Step 1: Analyze fast pointer movement
Fast moves n steps ahead. If n equals list length, fast becomes null.
Step 2: Check for null fast before accessing fast.next
Code does not check if fast is null before while loop, causing NullReferenceException.
Final Answer:
Does not handle case when fast becomes null after initial loop -> Option A
Quick Check:
Null fast after n steps = bug [OK]
Hint: Check if fast is null after initial n steps [OK]
Common Mistakes:
Ignoring null check for fast pointer
Moving slow pointer before fast is properly positioned
Returning wrong node as new head
5. You want to remove the 1st node from the end of a linked list with only one node: 10 -> null. What should the resulting list be?
hard
A. 10 -> null
B. null (empty list)
C. Error because list is too short
D. 10 -> 10 -> null
Solution
Step 1: Understand removing 1st node from end in single-node list
Removing last node means list becomes empty.
Step 2: Resulting list after removal
Since only node is removed, list is now null (empty).
Final Answer:
null (empty list) -> Option B
Quick Check:
Remove only node = empty list [OK]
Hint: Removing last node in single-node list empties it [OK]
Common Mistakes:
Returning original list instead of empty
Expecting error instead of empty list
Trying to access next node which does not exist
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.