📖 Scenario: You are working on a contact list app. The contacts are stored in a linked list, where each node holds a contact's name. Sometimes, you need to remove a contact counting from the end of the list, for example, the 2nd last contact.
🎯 Goal: Build a Java program that removes the nth node from the end of a singly linked list and prints the updated list.
📋 What You'll Learn
Create a singly linked list with exact nodes: "Alice" -> "Bob" -> "Charlie" -> "David" -> "Eve"
Create an integer variable n with value 2
Implement a method removeNthFromEnd that removes the nth node from the end
Print the linked list after removal in the format: Alice -> Bob -> Charlie -> Eve -> null
💡 Why This Matters
🌍 Real World
Linked lists are used in many applications like contact lists, music playlists, and undo history where elements are added or removed dynamically.
💼 Career
Understanding linked list manipulation is important for software engineering roles that involve data structure optimization and memory management.
Progress0 / 4 steps
1
Create the linked list
Create a class ListNode with a String val and ListNode next. Then create the linked list with nodes holding these exact values in order: "Alice", "Bob", "Charlie", "David", "Eve". Store the head node in a variable called head.
DSA Java
Hint
Define the ListNode class first. Then link nodes by setting next pointers.
2
Create the variable for n
Inside the main method, create an integer variable called n and set it to 2.
DSA Java
Hint
Just add int n = 2; inside the main method.
3
Implement removeNthFromEnd method
Add a static method removeNthFromEnd that takes ListNode head and int n as parameters. It removes the nth node from the end of the list and returns the new head. Use two pointers to find the node to remove.
DSA Java
Hint
Use a dummy node before head. Move first pointer n+1 steps ahead, then move both pointers until first is null. Remove the node after second.
4
Print the updated linked list
Add code inside main to print the linked list starting from head. Print each node's val followed by " -> ". End with null.
DSA Java
Hint
Use a while loop to traverse from head. Print each node's value 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 with a linked list?
easy
A. Reverse the entire linked list
B. Add a new node at the Nth position from the start
C. Find the value of the Nth node from the start
D. Remove the node that is Nth from the end of the list
Solution
Step 1: Understand the problem statement
The problem requires removing the node that is Nth from the end of the linked list, not from the start.
Step 2: Clarify the operation on the list
We do not add or reverse nodes; we specifically remove one node counting from the end.
Final Answer:
Remove the node that is Nth from the end of the list -> Option D
Quick Check:
Remove Nth from end = Remove Nth from end [OK]
Hint: Focus on 'Nth from end' means counting backwards [OK]
Common Mistakes:
Confusing Nth from end with Nth from start
Thinking the problem asks to add or reverse nodes
Ignoring the direction of counting nodes
2. Which of the following Java method signatures correctly represents a function to remove the Nth node from the end of a singly linked list?
easy
A. public ListNode removeNthFromEnd(ListNode head, int n)
B. public void removeNthFromEnd(int n, ListNode head)
C. public ListNode removeNode(ListNode head, int index)
D. public ListNode deleteNthNode(ListNode node, int n)
Solution
Step 1: Check method parameters and return type
The method should take the head of the list and an integer n, and return the new head after removal.
Step 2: Match signature with problem requirements
public ListNode removeNthFromEnd(ListNode head, int n) matches the expected signature: it takes (ListNode head, int n) and returns ListNode.
Final Answer:
public ListNode removeNthFromEnd(ListNode head, int n) -> Option A
Quick Check:
Correct signature = public ListNode removeNthFromEnd(ListNode head, int n) [OK]
Hint: Method must return updated head and accept head, n as parameters [OK]
Common Mistakes:
Wrong parameter order
Void return type instead of ListNode
Using incorrect parameter types
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 -> 2 -> 4 -> 5 -> null
B. 1 -> 2 -> 3 -> 5 -> null
C. 1 -> 3 -> 4 -> 5 -> null
D. 2 -> 3 -> 4 -> 5 -> null
Solution
Step 1: Identify the 2nd node from the end
Counting from the end: 5 (1st), 4 (2nd). So node with value 4 is to be removed.
Step 2: Remove node with value 4 and link previous node to next
After removal, list becomes 1 -> 2 -> 3 -> 5 -> null.
Final Answer:
1 -> 2 -> 3 -> 5 -> null -> Option B
Quick Check:
Remove 2nd from end = Remove node 4 [OK]
Hint: Count nodes from end to find which to remove [OK]
Common Mistakes:
Removing wrong node counting from start
Off-by-one errors in counting
Not updating links correctly after removal
4. Given the following code snippet to remove the Nth node from the end, what is the error?
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 != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
medium
A. The for loop should run from i = 0 to i < n, not i <= n
B. The slow pointer should start at null, not head
C. The method should return slow, not head
D. The while loop condition should be fast.next != null
Solution
Step 1: Analyze the for loop for moving fast pointer
The loop runs i from 0 to n inclusive (i <= n), moving fast n+1 steps, which is one step too many and causes NullPointerException.
Step 2: Correct the loop to run i < n to move fast exactly n steps ahead
This ensures fast is n nodes ahead of slow, allowing correct removal of the target node.
Final Answer:
The for loop should run from i = 0 to i < n, not i <= n -> Option A
Quick Check:
Loop count off by one = The for loop should run from i = 0 to i < n, not i <= n [OK]
Hint: Check loop bounds carefully for pointer steps [OK]
Common Mistakes:
Using i <= n instead of i < n in loop
Starting slow pointer incorrectly
Returning wrong node after removal
5. You have a linked list: 10 -> 20 -> 30 -> 40 -> 50 -> null. You want to remove the 5th node from the end. What will be the resulting list after removal?
hard
A. 30 -> 40 -> 50 -> null
B. 10 -> 20 -> 30 -> 40 -> null
C. 20 -> 30 -> 40 -> 50 -> null
D. 10 -> 20 -> 30 -> 40 -> 50 -> null
Solution
Step 1: Identify the 5th node from the end
Since the list has 5 nodes, the 5th from the end is the first node with value 10.
Step 2: Remove the first node and update head
Removing node 10 means the new head is node 20, so list becomes 20 -> 30 -> 40 -> 50 -> null.