Linked List: Program to find the nth node from the end of a linked list
Write a program to find the nth node from the end of the linked list
To find the nth node from the end, first we find the length of linked list.
Then subtract given position from the length to get the result position.
This positon is the required node from the start.
Traverse the linkedlist till that position and get required node
For example,
given linked list is -
10 -> 30 -> 50 -> 60 -> 90 -> 70 -> 40
we want to find the node at 5th position from the end
Length of linked list is 7, subtract 5 from length we get position from start as 2
So the 5th node from the end is the 2nd node from the start
Traverse till 2nd node and get the required output which is node(30)
Algorithm
- Find the length of the given linked list
- If the head is NULL, then return from the function
- Create one pointer, say current and point on head
- For finding position from start simply subtract given position from length and stored in variable 'mov'
- Using for loop traverse till that position and print required node data
Complexity
Time Complexity : O(n) , where n is the number of nodes in the linked list
Space Complexity : O(1)
Java Code
import java.util.*;
class FindNodeFromEnd{
class Node {
// initialising data field and next pointer of node
int data;
Node next;
Node(int d) {
this.data = d;
this.next = null;
}
}
Node head;
// creating a linked list using array
public void buildLinkedlist(int array[], int noOfNodes) {
int i;
Node temp, last;
temp = new Node(array[0]);
temp.next = null;
head = temp;
last = temp;
for (i = 1; i < noOfNodes; i++) {
temp = new Node(array[i]);
temp.next = null;
last.next = temp;
last = temp;
}
}
// printing of linkedList
public void printLinkedlist() {
List allNodesList = new ArrayList<>();
Node temp = head;
while (temp != null) {
allNodesList.add(Integer.toString(temp.data));
temp = temp.next;
}
System.out.println(String.join(" -> ", allNodesList));
}
public int getLength() {
Node temp = head;
int count = 1;
while (temp.next != null) {
temp = temp.next;
count++;
}
return count;
}
public int getNthFromLast(int n) {
// Your code here
if (head==null){
return 0;
}
Node current = head;
int mov = getLength() - n;
for (int i = 0; i < mov; i++) {
current = current.next;
}
return current.data;
}
public static void main(String[] args) {
int[] linkedlistElements = new int[] { 10, 30, 50, 60, 90, 70, 40 };
int numberOfNodes = 7;
// initialising object of linkedlist class
FindNodeFromEnd ll = new FindNodeFromEnd();
ll.buildLinkedlist(linkedlistElements, numberOfNodes);
System.out.println("Given Linked List ");
ll.printLinkedlist();
System.out.println("Element at 2nd position from end is "+ll.getNthFromLast(2));
System.out.println("Element at 5th position from end is "+ll.getNthFromLast(5));
}
}
Output
Given Linked List
10 -> 30 -> 50 -> 60 -> 90 -> 70 -> 40
Element at 2nd position from end is 70
Element at 5th position from end is 50