Remove Nth node from end of the Linked List
Last Updated :
04 Sep, 2024
Given a linked list. The task is to remove the Nth node from the end of the linked list.
Examples:
Input : LinkedList = 1 ->2 ->3 ->4 ->5 , N = 2
Output : 1 ->2 ->3 ->5
Explanation: Linked list after deleting the 2nd node from last which is 4, is 1 ->2 ->3 ->5
Input : LinkedList = 7 ->8 ->4 ->3 ->2 , N = 1
Output : 7 ->8 ->4 ->3
Explanation: Linked list after deleting the 1st node from last which is 2, is 7 ->8 ->4 ->3
[Expected Approach – 1] Find Equivalent node from Front – O(n) Time and O(1) Space:
To remove the Nth node from the end, first determine the length of the linked list. Then, delete the (length – N + 1)th node from the front.
Follow the steps below to solve the problem:
- Traverse the linked list to calculate its length.
- Compute the position to delete from the front : nodeToDelete = (length – N + 1).
- If nodeToDelete is 1, update the head to the next of head node.
- Traverse to the (target – 1)th node and update its next pointer to skip the target node.
- Return the modified linked list.
Below is the implementation of the above approach:
C++
// C++ program to delete nth node from last
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
Node(int new_data) {
data = new_data;
next = nullptr;
}
};
// Function to remove the Nth node from the end
Node* removeNthFromEnd(Node* head, int N) {
// Calculate the length of the linked list
int length = 0;
Node* curr = head;
while (curr != nullptr) {
length++;
curr = curr->next;
}
// Calculate the position to remove from front
int target = length - N + 1;
// If target is 1, remove the head node
if (target == 1) {
Node* newHead = head->next;
// Free memory of the removed node
delete head;
return newHead;
}
// Traverse to the node just before the target
curr = head;
for (int i = 1; i < target - 1; i++) {
curr = curr->next;
}
// Remove the target node
Node* nodeToDelete = curr->next;
curr->next = curr->next->next;
delete nodeToDelete;
return head;
}
void printList(Node* node) {
Node* curr = node;
while (curr != nullptr) {
cout << " " << curr->data;
curr = curr->next;
}
}
int main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node* head = new Node(1);
head->next = new Node(2);
head->next->next = new Node(3);
head->next->next->next = new Node(4);
head->next->next->next->next = new Node(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
return 0;
}
C
// C program to delete nth node from last
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
// Function to remove the Nth node from the end
struct Node* removeNthFromEnd(struct Node* head, int N) {
// Calculate the length of the linked list
int length = 0;
struct Node* curr = head;
while (curr != NULL) {
length++;
curr = curr->next;
}
// Calculate the position to remove from front
int target = length - N + 1;
// If target is 1, remove the head node
if (target == 1) {
struct Node* newHead = head->next;
// Free memory of the removed node
free(head);
return newHead;
}
// Traverse to the node just before the target
curr = head;
for (int i = 1; i < target - 1; i++) {
curr = curr->next;
}
// Remove the target node
struct Node* nodeToDelete = curr->next;
curr->next = curr->next->next;
// Free memory of the removed node
free(nodeToDelete);
return head;
}
void printList(struct Node* node) {
struct Node* curr = node;
while (curr != NULL) {
printf(" %d", curr->data);
curr = curr->next;
}
}
struct Node* createNode(int new_data) {
struct Node* new_node
= (struct Node*)malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = NULL;
return new_node;
}
int main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
struct Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
head->next->next->next->next = createNode(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
return 0;
}
Java
// Java program to delete nth node from last
class Node {
int data;
Node next;
Node(int new_data) {
data = new_data;
next = null;
}
}
// Class containing the function to remove Nth node from end
public class GfG {
// Function to remove the Nth node from the end
static Node removeNthFromEnd(Node head, int N) {
// Calculate the length of the linked list
int length = 0;
Node curr = head;
while (curr != null) {
length++;
curr = curr.next;
}
// Calculate the position to remove from front
int target = length - N + 1;
// If target is 1, remove the head node
if (target == 1) {
return head.next;
}
// Traverse to the node just before the target
curr = head;
for (int i = 1; i < target - 1; i++) {
curr = curr.next;
}
// Remove the target node
curr.next = curr.next.next;
return head;
}
// This function prints the contents of the linked list
static void printList(Node node) {
Node curr = node;
while (curr != null) {
System.out.print(" " + curr.data);
curr = curr.next;
}
}
public static void main(String[] args) {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
}
}
Python
# Python3 program to delete nth node from last
class Node:
def __init__(self, new_data):
self.data = new_data
self.next = None
# Given the head of a list, remove the Nth node from the end
def remove_nth_from_end(head, N):
# Calculate the length of the linked list
length = 0
curr = head
while curr is not None:
length += 1
curr = curr.next
# Calculate the position to remove from the front
target = length - N + 1
# If target is 1, remove the head node
if target == 1:
return head.next
# Traverse to the node just before the target node
curr = head
for _ in range(target - 2):
curr = curr.next
# Remove the target node
curr.next = curr.next.next
return head
def print_list(node):
curr = node;
while curr is not None:
print(f" {curr.data}", end="")
curr = curr.next
print()
if __name__ == "__main__":
# Create a hard-coded linked list:
# 1 -> 2 -> 3 -> 4 -> 5
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
head.next.next.next.next = Node(5)
N = 2
head = remove_nth_from_end(head, N)
print_list(head)
C#
// C# program to delete nth node from last
using System;
class Node {
public int Data;
public Node next;
public Node(int newData) {
Data = newData;
next = null;
}
}
// Class containing the function to remove the Nth node from
// end
class GfG {
static Node RemoveNthFromEnd(Node head, int N) {
// Calculate the length of the linked list
int length = 0;
Node curr = head;
while (curr != null) {
length++;
curr = curr.next;
}
// Calculate the position to remove from the front
int target = length - N + 1;
// If target is 1, remove the head node
if (target == 1) {
return head.next;
}
// Traverse to the node just before the target node
curr = head;
for (int i = 1; i < target - 1; i++) {
curr = curr.next;
}
// Remove the target node
curr.next = curr.next.next;
return head;
}
static void PrintList(Node node) {
Node curr = node;
while (curr != null) {
Console.Write(" " + curr.Data);
curr = curr.next;
}
Console.WriteLine();
}
static void Main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
int N = 2;
head = RemoveNthFromEnd(head, N);
PrintList(head);
}
}
JavaScript
// Javascript program to delete nth node from last
class Node {
constructor(newData) {
this.data = newData;
this.next = null;
}
}
// Given the head of a list, remove the Nth node from the end
function removeNthFromEnd(head, N) {
// Calculate the length of the linked list
let length = 0;
let curr = head;
while (curr !== null) {
length++;
curr = curr.next;
}
// Calculate the position to remove from the front
let target = length - N + 1;
// If target is 1, remove the head node
if (target === 1) {
return head.next;
}
// Traverse to the node just before the target node
curr = head;
for (let i = 1; i < target - 1; i++) {
curr = curr.next;
}
// Remove the target node
curr.next = curr.next.next;
return head;
}
function printList(node) {
let curr = node;
while (curr !== null) {
process.stdout.write(" " + curr.data);
curr = curr.next;
}
console.log();
}
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
let head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
let N = 2;
head = removeNthFromEnd(head, N);
printList(head);
Time Complexity: O(2n), due to traversing the list twice (once for length calculation and once for node removal).
Auxiliary Space: O(1).
[Expected Approach – 2] Using Fast and Slow Pointer – O(n) Time and O(1) Space:
The idea is to first move the fast pointer N steps ahead, then move both fast and slow pointers together until fast reaches the end. The slow pointer will then be just before the node to be removed, allowing to update the next pointer to skip the target node.
Below is the implementation of the above approach:
C++
// C++ program to delete nth node from last
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node* next;
Node(int new_data) {
data = new_data;
next = nullptr;
}
};
// Function to remove the Nth node from the end
Node* removeNthFromEnd(Node* head, int N) {
// Initialize two pointers, fast and slow
Node* fast = head;
Node* slow = head;
// Move fast pointer N steps ahead
for (int i = 0; i < N; i++) {
if (fast == nullptr) return head;
fast = fast->next;
}
// If fast is null, remove the head node
if (fast == nullptr) {
Node* newHead = head->next;
delete head;
return newHead;
}
// Move both pointers until fast reaches the end
while (fast->next != nullptr) {
fast = fast->next;
slow = slow->next;
}
// Remove the Nth node from the end
Node* nodeToDelete = slow->next;
slow->next = slow->next->next;
delete nodeToDelete;
return head;
}
void printList(Node* node) {
Node* curr = node;
while (curr != nullptr) {
cout << " " << curr->data;
curr = curr->next;
}
}
int main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node* head = new Node(1);
head->next = new Node(2);
head->next->next = new Node(3);
head->next->next->next = new Node(4);
head->next->next->next->next = new Node(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
return 0;
}
C
// C program to delete nth node from last
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* next;
};
// Function to remove the Nth node from the end
struct Node* removeNthFromEnd(struct Node* head, int N) {
// Initialize two pointers, fast and slow
struct Node* fast = head;
struct Node* slow = head;
// Move fast pointer N steps ahead
for (int i = 0; i < N; i++) {
if (fast == NULL) return head;
fast = fast->next;
}
// If fast is NULL, remove the head node
if (fast == NULL) {
struct Node* newHead = head->next;
free(head);
return newHead;
}
// Move both pointers until fast reaches the end
while (fast->next != NULL) {
fast = fast->next;
slow = slow->next;
}
// Remove the Nth node from the end
struct Node* nodeToDelete = slow->next;
slow->next = slow->next->next;
free(nodeToDelete);
return head;
}
void printList(struct Node* node) {
struct Node* curr = node;
while (curr != NULL) {
printf(" %d", curr->data);
curr = curr->next;
}
}
struct Node* createNode(int new_data) {
struct Node* new_node
= (struct Node*)malloc(sizeof(struct Node));
new_node->data = new_data;
new_node->next = NULL;
return new_node;
}
int main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
struct Node* head = createNode(1);
head->next = createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
head->next->next->next->next = createNode(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
return 0;
}
Java
// Java program to delete nth node from last
class Node {
int data;
Node next;
Node(int new_data) {
data = new_data;
next = null;
}
}
// Class containing the function to remove Nth node from end
public class GfG {
// remove the Nth node from last
static Node removeNthFromEnd(Node head, int N) {
// Initialize two pointers, fast and slow
Node fast = head;
Node slow = head;
// Move fast pointer N steps ahead
for (int i = 0; i < N; i++) {
if (fast == null)
return head;
fast = fast.next;
}
// If fast is null, remove the head node
if (fast == null) {
return head.next;
}
// Move both pointers until fast reaches the end
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// Remove the Nth node from the end
slow.next = slow.next.next;
return head;
}
// This function prints the contents of the linked list
static void printList(Node node) {
Node curr = node;
while (curr != null) {
System.out.print(" " + curr.data);
curr = curr.next;
}
}
public static void main(String[] args) {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
int N = 2;
head = removeNthFromEnd(head, N);
printList(head);
}
}
Python
# Python3 program to delete nth node from last
class Node:
def __init__(self, new_data):
self.data = new_data
self.next = None
# Given the head of a list, remove the Nth node from the end
def remove_nth_from_end(head, N):
# Initialize two pointers, fast and slow
fast = head
slow = head
# Move fast pointer N steps ahead
for _ in range(N):
if fast is None:
return head
fast = fast.next
# If fast is None, remove the head node
if fast is None:
return head.next
# Move both pointers until fast reaches the end
while fast.next is not None:
fast = fast.next
slow = slow.next
# Remove the Nth node from the end
slow.next = slow.next.next
return head
def print_list(node):
curr = node;
while curr is not None:
print(f" {curr.data}", end="")
curr = curr.next
print()
if __name__ == "__main__":
# Create a hard-coded linked list:
# 1 -> 2 -> 3 -> 4 -> 5
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
head.next.next.next.next = Node(5)
N = 2
head = remove_nth_from_end(head, N)
print_list(head)
C#
// C# program to delete nth node from last
using System;
class Node {
public int Data;
public Node next;
public Node(int newData) {
Data = newData;
next = null;
}
}
// Class containing the function to
// remove the Nth node from end
class GfG {
static Node RemoveNthFromEnd(Node head, int N) {
// Initialize two pointers, fast and slow
Node fast = head;
Node slow = head;
// Move fast pointer N steps ahead
for (int i = 0; i < N; i++) {
if (fast == null) return head;
fast = fast.next;
}
// If fast is null, remove the head node
if (fast == null) {
return head.next;
}
// Move both pointers until fast reaches the end
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
// Remove the Nth node from the end
slow.next = slow.next.next;
return head;
}
static void PrintList(Node node) {
Node curr = node;
while (curr != null) {
Console.Write(" " + curr.Data);
curr = curr.next;
}
Console.WriteLine();
}
static void Main() {
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
int N = 2;
head = RemoveNthFromEnd(head, N);
PrintList(head);
}
}
JavaScript
// JavaScript program to delete nth node from last
class Node {
constructor(newData) {
this.data = newData;
this.next = null;
}
}
// Given the head of a list, remove the
// Nth node from the end
function removeNthFromEnd(head, N) {
// Initialize two pointers, fast and slow
let fast = head;
let slow = head;
// Move fast pointer N steps ahead
for (let i = 0; i < N; i++) {
if (fast === null) return head;
fast = fast.next;
}
// If fast is null, remove the head node
if (fast === null) {
return head.next;
}
// Move both pointers until fast reaches the end
while (fast.next !== null) {
fast = fast.next;
slow = slow.next;
}
// Remove the Nth node from the end
slow.next = slow.next.next;
return head;
}
function printList(node) {
let curr = node;
while (curr !== null) {
process.stdout.write(" " + curr.data);
curr = curr.next;
}
console.log();
}
// Create a hard-coded linked list:
// 1 -> 2 -> 3 -> 4 -> 5
let head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.next.next.next = new Node(4);
head.next.next.next.next = new Node(5);
let N = 2;
head = removeNthFromEnd(head, N);
printList(head);
Time complexity: O(n), due to a single pass through the list with the two pointers.
Space complexity: O(1).