Remove Nth node from end of the Linked List

20 Apr, 2022
Given a linked list. The task is to remove the Nth node from the end of the linked list.
Examples:  
Input : 1->2->3->4->5 , N = 2 Output : 1->2->3->5
Input : 7->8->4->3->2 , N = 1 Output : 7->8->4->3  
Prerequisites: 1. Delete a node from the linked list. 2. Find the nth node from the end of the linked listApproach: Deleting the Bth node from last is basically the same as deleting (length-B+1) from the start. In our approach, first, we evaluate the length of the linked list, then check 
If length < B, then we can’t remove the node
If length = B, then return head->next
If length > B, then it means we have to delete the intermediate node, we will delete this node and make its prev node point to the next node of the deleted node.  
C
C++
Java
Python3
C#
Javascript
// C program to delete nth node from last#include<stdio.h>#include<stdlib.h>// Structure of nodestruct Node {    int data;    struct Node* next;}; // Function to insert node in a linked liststruct Node* create(struct Node* head, int x){    struct Node *temp, *ptr = head;    temp = (struct Node*)malloc(sizeof(struct Node));    temp->data = x;    temp->next = NULL;    if (head == NULL)        head = temp;    else {        while (ptr->next != NULL) {            ptr = ptr->next;        }        ptr->next = temp;    }    return head;} // Function to remove nth node from laststruct Node* removeNthFromEnd(struct Node* head, int B){    // To store length of the linked list    int len = 0;    struct Node* tmp = head;    while (tmp != NULL) {        len++;        tmp = tmp->next;    }     // B > length, then we can't remove node    if (B > len)    {        printf( "Length of the linked list is  %d",len );        printf( " we can't remove %dth node from the",B);        printf(" linked list\n");        return head;    }     // We need to remove head node    else if (B == len) {         // Return head->next        return head->next;     }    else    {        // Remove len - B th node from starting        int diff = len - B;        struct Node* prev= NULL;        struct Node* curr = head;        for(int i = 0;i < diff;i++){            prev = curr;            curr = curr->next;        }        prev->next = curr->next;        return head;    } } // This function prints contents of linked// list starting from the given nodevoid display(struct Node* head){     struct Node* temp = head;    while (temp != NULL) {        printf("%d  ",temp->data);        temp = temp->next;    }    printf("\n");} // Driver codeint main(){    struct Node* head = NULL;      head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);     int n = 2;     printf("Linked list before modification: \n");    display(head);     head = removeNthFromEnd(head, 2);    printf("Linked list after modification: \n");    display(head);     return 0;}
// CPP program to delete nth node from last#include <bits/stdc++.h>using namespace std; // Structure of nodestruct Node {    int data;    struct Node* next;}; // Function to insert node in a linked liststruct Node* create(struct Node* head, int x){    struct Node *temp, *ptr = head;    temp = new Node();    temp->data = x;    temp->next = NULL;    if (head == NULL)        head = temp;    else {        while (ptr->next != NULL) {            ptr = ptr->next;        }        ptr->next = temp;    }    return head;} // Function to remove nth node from lastNode* removeNthFromEnd(Node* head, int B){    // To store length of the linked list    int len = 0;    Node* tmp = head;    while (tmp != NULL) {        len++;        tmp = tmp->next;    }         // B > length, then we can't remove node    if (B > len)    {        cout << "Length of the linked list is " << len;        cout  << " we can't remove "<< B << "th node from the";        cout << " linked list\n";        return head;    }         // We need to remove head node    else if (B == len) {                 // Return head->next        return head->next;             }    else    {        // Remove len - B th node from starting        int diff = len - B;                 Node* prev= NULL;              Node* curr = head;                for(int i = 0;i < diff;i++){            prev = curr;                       curr = curr->next;             }        prev->next = curr->next;        return head;    }     } // This function prints contents of linked// list starting from the given nodevoid display(struct Node* head){     struct Node* temp = head;    while (temp != NULL) {        cout << temp->data << " ";        temp = temp->next;    }    cout << endl;} // Driver codeint main(){    struct Node* head = NULL;              head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);         int n = 2;         cout << "Linked list before modification: \n";    display(head);     head = removeNthFromEnd(head, 2);    cout << "Linked list after modification: \n";    display(head);     return 0;}
// Java program to delete nth node from lastclass GFG{ // Structure of nodestatic class Node{    int data;    Node next;}; // Function to insert node in a linked liststatic Node create(Node head, int x){    Node temp, ptr = head;    temp = new Node();    temp.data = x;    temp.next = null;    if (head == null)        head = temp;    else    {        while (ptr.next != null)        {            ptr = ptr.next;        }        ptr.next = temp;    }    return head;} // Function to remove nth node from laststatic Node removeNthFromEnd(Node head, int B){    // To store length of the linked list    int len = 0;    Node tmp = head;    while (tmp != null)    {        len++;        tmp = tmp.next;    }         // B > length, then we can't remove node    if (B > len)    {        System.out.print("Length of the linked list is " + len);        System.out.print(" we can't remove "+ B +                         "th node from the");        System.out.print(" linked list\n");        return head;    }         // We need to remove head node    else if (B == len)    {                 // Return head.next        return head.next;             }    else    {        // Remove len - B th node from starting        int diff = len - B;                Node prev= null;            Node curr = head;                for(int i = 0; i < diff; i++)        {            prev = curr;                    curr = curr.next;            }        prev.next = curr.next;        return head;    }     } // This function prints contents of linked// list starting from the given nodestatic void display(Node head){    Node temp = head;    while (temp != null)    {        System.out.print(temp.data + " ");        temp = temp.next;    }    System.out.println();} // Driver codepublic static void main(String[] args){    Node head = null;         head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);         int n = 2;         System.out.print("Linked list before modification: \n");    display(head);     head = removeNthFromEnd(head, 2);    System.out.print("Linked list after modification: \n");    display(head);}} // This code is contributed by Rajput-Ji
# Python3 program to delete nth node from lastclass Node:     # Function to initialise the node object    def __init__(self, data):        self.data = data # Assign data        self.next = None # Initialize next as null class LinkedList:     # Function to initialize head    def __init__(self):        self.head = None     # Function to add node at the end    def create(self, x):         new_node = Node(x)         if self.head is None:            self.head = new_node            return         last = self.head        while last.next:            last = last.next         last.next = new_node     # This function prints contents of linked    # list starting from the given node    def display(self):        temp = self.head         while temp:            print(temp.data, end = " ")            temp = temp.next # Function to remove nth node from lastdef removeNthFromEnd(head, k):         # the function uses two pointer method    first = head    second = head    count = 1    while count <= k:        second = second.next        count += 1    if second is None:        head.value = head.next.value        head.next = head.next.next        return    while second.next is not None:        first = first.next        second = second.next    first.next = first.next.next # Driver code # val list contains list of valuesval = [1, 2, 3, 4, 5]k = 2ll = LinkedList()for i in val:    ll.create(i) print("Linked list before modification:");ll.display() removeNthFromEnd(ll.head, k) print("\nLinked list after modification:");ll.display() # This code is contributed by Dhinesh
// C# program to delete nth node from lastusing System;     class GFG{ // Structure of nodeclass Node{    public int data;    public Node next;}; // Function to insert node in a linked liststatic Node create(Node head, int x){    Node temp, ptr = head;    temp = new Node();    temp.data = x;    temp.next = null;    if (head == null)        head = temp;    else    {        while (ptr.next != null)        {            ptr = ptr.next;        }        ptr.next = temp;    }    return head;} // Function to remove nth node from laststatic Node removeNthFromEnd(Node head, int B){    // To store length of the linked list    int len = 0;    Node tmp = head;    while (tmp != null)    {        len++;        tmp = tmp.next;    }         // B > length, then we can't remove node    if (B > len)    {        Console.Write("Length of the linked list is " + len);        Console.Write(" we can't remove " + B +                           "th node from the");        Console.Write(" linked list\n");        return head;    }         // We need to remove head node    else if (B == len)    {                 // Return head.next        return head.next;             }    else    {        // Remove len - B th node from starting        int diff = len - B;                Node prev= null;            Node curr = head;                for(int i = 0; i < diff; i++)        {            prev = curr;                    curr = curr.next;            }        prev.next = curr.next;        return head;    }     } // This function prints contents of linked// list starting from the given nodestatic void display(Node head){    Node temp = head;    while (temp != null)    {        Console.Write(temp.data + " ");        temp = temp.next;    }    Console.Write("\n");} // Driver codepublic static void Main(String[] args){    Node head = null;         head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);         Console.Write("Linked list before modification: \n");    display(head);     head = removeNthFromEnd(head, 2);    Console.Write("Linked list after modification: \n");    display(head);}} // This code is contributed by 29AjayKumar
<script>// javascript program to delete nth node from last    // Structure of node    class Node {        constructor() {            this.data = 0;            this.next = null;        }    }    // Function to insert node in a linked list    function create(head , x) {        var temp, ptr = head;        temp = new Node();        temp.data = x;        temp.next = null;        if (head == null)            head = temp;        else {            while (ptr.next != null) {                ptr = ptr.next;            }            ptr.next = temp;        }        return head;    }     // Function to remove nth node from last    function removeNthFromEnd(head , B) {        // To store length of the linked list        var len = 0;        var tmp = head;        while (tmp != null) {            len++;            tmp = tmp.next;        }         // B > length, then we can't remove node        if (B > len) {            document.write("Length of the linked list is " + len);            document.write(" we can't remove " + B + "th node from the");            document.write(" linked list\n");            return head;        }         // We need to remove head node        else if (B == len) {             // Return head.next            return head.next;         }        else {            // Remove len - B th node from starting            var diff = len - B;            var prev = null;            var curr = head;            for (i = 0; i < diff; i++) {                prev = curr;                curr = curr.next;            }            prev.next = curr.next;            return head;        }     }     // This function prints contents of linked    // list starting from the given node    function display(head) {        var temp = head;        while (temp != null) {            document.write(temp.data + " ");            temp = temp.next;        }        document.write("<br/>");    }     // Driver code             var head = null;         head = create(head, 1);        head = create(head, 2);        head = create(head, 3);        head = create(head, 4);        head = create(head, 5);         var n = 2;         document.write("Linked list before modification: <br/>");        display(head);         head = removeNthFromEnd(head, 2);        document.write("Linked list after modification: <br/>");        display(head); // This code contributed by Rajput-Ji</script>
Linked list before modification: 
1  2  3  4  5  
Linked list after modification: 
1  2  3  5  
Another Approach: Two Pointer ApproachDeleting the Bth node from last is basically the same as deleting (length-B+1) from the start. In our approach, we will define 2 pointers, fast pointer and slow pointer.Algorithm: 
Take two Node slowPtr and fastPtr, such that next points to the headTake one Node to store the head, initially it’s a dummy node(start), and the next of the node will be pointing to the head. The dummy node is taken to handle the edge case where B=N(size of the LinkedList)Start traversing until the fast pointer reaches the nth nodeStart traversing by one step both of the pointers until the fast pointers reach the endWhen the traversal is done, delete the next node to slowPtrReturn the next of start
Take two Node slowPtr and fastPtr, such that next points to the head
Take one Node to store the head, initially it’s a dummy node(start), and the next of the node will be pointing to the head. The dummy node is taken to handle the edge case where B=N(size of the LinkedList)
Start traversing until the fast pointer reaches the nth node
Start traversing by one step both of the pointers until the fast pointers reach the end
When the traversal is done, delete the next node to slowPtr
Return the next of start
C++
C
// CPP program to delete nth node from last#include <bits/stdc++.h>using namespace std; // Structure of nodestruct Node {    int data;    struct Node* next;}; // Function to insert node in a linked liststruct Node* create(struct Node* head, int x){    struct Node *temp, *ptr = head;    temp = new Node();    temp->data = x;    temp->next = NULL;    if (head == NULL)        head = temp;    else {        while (ptr->next != NULL) {            ptr = ptr->next;        }        ptr->next = temp;    }    return head;} // Function to remove nth node from lastNode* removeNthFromEnd(Node* head, int B){        Node *start = new Node();        start -> next = head;        Node* fastPtr = start;        Node* slowPtr = start;        // Traverse the LinkedList B times        for(int i = 0; i < B; i++){          fastPtr = fastPtr->next;        }       //Increase the slow pointer        while(fastPtr->next != NULL)        {            fastPtr = fastPtr->next;            slowPtr = slowPtr->next;        }        //Deletion step        slowPtr->next = slowPtr->next->next;       //Return head        return start->next;} // This function prints contents of linked// list starting from the given nodevoid display(struct Node* head){    struct Node* temp = head;    while (temp != NULL) {        cout << temp->data << " ";        temp = temp->next;    }    cout << endl;} // Driver codeint main(){    struct Node* head = NULL;    head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);         int n = 2;         cout << "Linked list before modification: \n";    display(head);     head = removeNthFromEnd(head, 2);    cout << "Linked list after modification: \n";    display(head);    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// C program to delete nth node from last#include <stdio.h>#include <stdlib.h> // Structure of nodetypedef struct Node {    int data;    struct Node* next;} Node; // Function to insert node in a linked listNode* create(Node* head, int x){    Node* ptr = head;    Node* temp = (Node*)malloc(sizeof(Node));    temp->data = x;    temp->next = NULL;    if (head == NULL)        head = temp;    else {        while (ptr->next != NULL)            ptr = ptr->next;        ptr->next = temp;    }    return head;} // Function to remove nth node from lastNode* removeNthFromEnd(Node* head, int B){    Node* start = (Node*)malloc(sizeof(Node));    start->next = head;    Node* fastPtr = start;    Node* slowPtr = start;    // Traverse the LinkedList B times    for (int i = 0; i < B; i++)        fastPtr = fastPtr->next;    // Increase the slow pointer    while (fastPtr->next != NULL) {        fastPtr = fastPtr->next;        slowPtr = slowPtr->next;    }    // Deletion step    slowPtr->next = slowPtr->next->next;    // Return head    return start->next;} // This function prints contents of linked// list starting from the given nodevoid display(struct Node* head){    struct Node* temp = head;    while (temp != NULL) {        printf("%d  ", temp->data);        temp = temp->next;    }    printf("\n");} // Driver codeint main(){    struct Node* head = NULL;    head = create(head, 1);    head = create(head, 2);    head = create(head, 3);    head = create(head, 4);    head = create(head, 5);    int n = 2;    printf("Linked list before modification: \n");    display(head);    head = removeNthFromEnd(head, 2);    printf("Linked list after modification: \n");    display(head);    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
Linked list before modification: 
1 2 3 4 5 
Linked list after modification: 
1 2 3 5 
Rajput-Ji
29AjayKumar
Dhinesh Sunder Ganapathi
sooda367
manisharya12344
The_Error
adityakumar129
Traversal
Linked List
Mathematical
Linked List
Mathematical
Traversal
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
LinkedList in Java
Introduction to Data Structures
Doubly Linked List | Set 1 (Introduction and Insertion)
Merge two sorted linked lists
What is Data Structure: Types, Classifications and Applications
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays