Find the nth node from the end in the given linked list using a recursive approach.
Examples:
Input : list: 4->2->1->5->3
n = 2
Output : 5
Algorithm:
findNthFromLast(head, n, count, nth_last)
if head == NULL then
return
findNthFromLast(head->next, n, count, nth_last)
count = count + 1
if count == n then
nth_last = head
findNthFromLastUtil(head, n)
Initialize nth_last = NULL
Initialize count = 0
findNthFromLast(head, n, &count, &nth_last)
if nth_last != NULL then
print nth_last->data
else
print "Node does not exists"
Note: Parameters count and nth_last will be pointer variables in findNthFromLast().
C++
// C++ implementation to recursively find the nth node from// the last of the linked list#include <bits/stdc++.h>using namespace std;// structure of a node of a linked liststruct Node { int data; Node* next;};// function to get a new nodeNode* getNode(int data){ // allocate space Node* newNode = new Node; // put in data newNode->data = data; newNode->next = NULL; return newNode;}// function to recursively find the nth node from// the last of the linked listvoid findNthFromLast(Node* head, int n, int* count, Node** nth_last){ // if list is empty if (!head) return; // recursive call findNthFromLast(head->next, n, count, nth_last); // increment count *count = *count + 1; // if true, then head is the nth node from the last if (*count == n) *nth_last = head;}// utility function to find the nth node from// the last of the linked listvoid findNthFromLastUtil(Node* head, int n){ // Initialize Node* nth_last = NULL; int count = 0; // find nth node from the last findNthFromLast(head, n, &count, &nth_last); // if node exists, then print it if (nth_last != NULL) cout << "Nth node from last is: " << nth_last->data; else cout << "Node does not exists";}// Driver program to test aboveint main(){ // linked list: 4->2->1->5->3 Node* head = getNode(4); head->next = getNode(2); head->next->next = getNode(1); head->next->next->next = getNode(5); head->next->next->next->next = getNode(3); int n = 2; findNthFromLastUtil(head, n); return 0;} |
Java
// Java implementation to recursively // find the nth node from the last// of the linked list import java.util.*;class GFG{static int count = 0, data = 0;// a node of a linked list static class Node { int data; Node next; }// function to get a new node static Node getNode(int data) { // allocate space Node newNode = new Node(); // put in data newNode.data = data; newNode.next = null; return newNode; } // function to recursively // find the nth node from // the last of the linked list static void findNthFromLast(Node head, int n, Node nth_last) { // if list is empty if (head == null) return; // recursive call findNthFromLast(head.next, n, nth_last); // increment count count = count + 1; // if true, then head is the // nth node from the last if (count == n) { data = head.data; }} // utility function to find // the nth node from the last// of the linked list static void findNthFromLastUtil(Node head, int n) { // Initialize Node nth_last = new Node(); // find nth node from the last findNthFromLast(head, n, nth_last); // if node exists, then print it if (nth_last != null) System.out.println("Nth node from last is: " + data); else System.out.println("Node does not exists"); } // Driver Codepublic static void main(String args[]){ // linked list: 4.2.1.5.3 Node head = getNode(4); head.next = getNode(2); head.next.next = getNode(1); head.next.next.next = getNode(5); head.next.next.next.next = getNode(3); int n = 2; findNthFromLastUtil(head, n); } }// This code is contributed // by Arnab Kundu |
Python
# Python implementation to recursively # find the nth node from the last # of the linked list count = 0data = 0# a node of a linked list class Node(object): def __init__(self, d): self.data = d self.next = None# function to get a new node def getNode(data): # allocate space newNode = Node(0) # put in data newNode.data = data newNode.next = None return newNode # function to recursively # find the nth node from # the last of the linked list def findNthFromLast(head, n, nth_last) : global count global data # if list is empty if (head == None): return # recursive call findNthFromLast(head.next, n, nth_last) # increment count count = count + 1 # if true, then head is the # nth node from the last if (count == n) : data = head.data # utility function to find # the nth node from the last # of the linked list def findNthFromLastUtil(head, n) : global count global data # Initialize nth_last = Node(0) count = 0 # find nth node from the last findNthFromLast(head, n, nth_last) # if node exists, then print it if (nth_last != None) : print("Nth node from last is: " , data) else: print("Node does not exists") # Driver Code # linked list: 4.2.1.5.3 head = getNode(4) head.next = getNode(2) head.next.next = getNode(1) head.next.next.next = getNode(5) head.next.next.next.next = getNode(3) n = 2findNthFromLastUtil(head, n) # This code is contributed # by Arnab Kundu |
C#
// C# implementation to recursively // find the nth node from the last// of the linked list using System;public class GFG{ static int count = 0, data = 0; // a node of a linked list class Node { public int data; public Node next; }// function to get a new node static Node getNode(int data) { // allocate space Node newNode = new Node(); // put in data newNode.data = data; newNode.next = null; return newNode; } // function to recursively // find the nth node from // the last of the linked list static void findNthFromLast(Node head, int n, Node nth_last) { // if list is empty if (head == null) return; // recursive call findNthFromLast(head.next, n, nth_last); // increment count count = count + 1; // if true, then head is the // nth node from the last if (count == n) { data = head.data; }} // utility function to find // the nth node from the last// of the linked list static void findNthFromLastUtil(Node head, int n) { // Initialize Node nth_last = new Node(); count = 0; // find nth node from the last findNthFromLast(head, n, nth_last); // if node exists, then print it if (nth_last != null) Console.WriteLine("Nth node from last is: " + data); else Console.WriteLine("Node does not exists"); } // Driver Codepublic static void Main(String []args){ // linked list: 4.2.1.5.3 Node head = getNode(4); head.next = getNode(2); head.next.next = getNode(1); head.next.next.next = getNode(5); head.next.next.next.next = getNode(3); int n = 2; findNthFromLastUtil(head, n); } }// This code is contributed by Rajput-Ji |
Javascript
<script> // JavaScript implementation to recursively // find the nth node from the last // of the linked list var count = 0, data = 0; // a node of a linked list class Node { constructor() { this.data = 0; this.next = null; } } // function to get a new node function getNode(data) { // allocate space var newNode = new Node(); // put in data newNode.data = data; newNode.next = null; return newNode; } // function to recursively // find the nth node from // the last of the linked list function findNthFromLast(head, n, nth_last) { // if list is empty if (head == null) return; // recursive call findNthFromLast(head.next, n, nth_last); // increment count count = count + 1; // if true, then head is the // nth node from the last if (count == n) { data = head.data; } } // utility function to find // the nth node from the last // of the linked list function findNthFromLastUtil(head, n) { // Initialize var nth_last = new Node(); count = 0; // find nth node from the last findNthFromLast(head, n, nth_last); // if node exists, then print it if (nth_last != null) document.write("Nth node from last is: " + data + "<br>"); else document.write("Node does not exists <br>"); } // Driver Code // linked list: 4.2.1.5.3 var head = getNode(4); head.next = getNode(2); head.next.next = getNode(1); head.next.next.next = getNode(5); head.next.next.next.next = getNode(3); var n = 2; findNthFromLastUtil(head, n); </script> |
Output:
Nth node from last is: 5
Time Complexity: O(N), as we are using a loop to traverse N times, where N is the number of Nodes in the linked list.
Auxiliary Space: O(N) for call stack since using recursion
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
