Table of Contents
Given a linked list, write a program for finding the nth element from the end of the linked list
Example
Input: 6->16->15->50->1->23->49, N= 3
Output : 1
Here, the 3rd element from the end is 1
Time Complexity : O(n),
where n is the length of the linked list.
Algorithm
This is one of the method to find the nth element from the end of a Linked List
1. Create two pointers first, second and initialize them to the head of the linked list
2. Move the second pointer N steps
3. Till second->next not equal to Null, move first and second pointer one step ahead.
4. first is the nth element from the end.
C++ Program
#include <bits/stdc++.h> using namespace std; struct LL{ int data; LL *next; }; void insertAtBeginning(struct LL**head,int dataToBeInserted) { struct LL* curr=new LL; curr->data=dataToBeInserted; curr->next=NULL; if(*head==NULL) *head=curr; //if this is first node make this as head of list else { curr->next=*head; //else make the current (new) node's next point to head and make this new node a the head *head=curr; } //O(1) constant time } struct LL* nthNodeFromEnd(struct LL**head,int n) { struct LL*first=*head , *second = *head; for(int i=1;i<n;i++) // increase second pointer ahead by n steps { if(second) second=second->next; else break; } if(second == NULL) { cout<<"List has less than specified number of nodes\n"; return NULL; } while(second->next!=NULL) //increase by one steps now till we reach the last node and now the first will point to Nth from end { first = first->next; second = second->next; } return first; } void display(struct LL**head) { struct LL*temp=*head; while(temp!=NULL) { if(temp->next!=NULL) cout<<temp->data<<" ->"; else cout<<temp->data; temp=temp->next; //move to next node } //O(number of nodes) cout<<endl; } int main() { struct LL *head = NULL; //initial list has no elements insertAtBeginning(&head,6); insertAtBeginning(&head,16); insertAtBeginning(&head,15); insertAtBeginning(&head,50); insertAtBeginning(&head,1); insertAtBeginning(&head,23); display(&head); int N = 3; //number of node whose value is to be known struct LL * NthFromEnd = nthNodeFromEnd(&head,N); if(NthFromEnd == NULL) { } else cout<<N<<" th node from end is "<<NthFromEnd->data<<endl; return 0; }