Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find nth element from the end of a singly linked list?

The following function is trying to find the nth to last element of a singly linked list.

For example:

If the elements are 8->10->5->7->2->1->5->4->10->10 then the result is 7th to last node is 7.

Can anybody help me on how this code is working or is there a better and simpler approach?

LinkedListNode nthToLast(LinkedListNode head, int n) {   if (head == null || n < 1) {     return null;   }    LinkedListNode p1 = head;   LinkedListNode p2 = head;    for (int j = 0; j < n - 1; ++j) { // skip n-1 steps ahead     if (p2 == null) {       return null; // not found since list size < n     }     p2 = p2.next;   }    while (p2.next != null) {     p1 = p1.next;     p2 = p2.next;   }    return p1; } 
like image 663
Jony Avatar asked Apr 08 '10 08:04

Jony


People also ask

How do you find nth element from the end of singly linked list explain with suitable example?

1) Calculate the length of the Linked List. Let the length be len. 2) Print the (len – n + 1)th node from the beginning of the Linked List. Double pointer concept: First pointer is used to store the address of the variable and the second pointer is used to store the address of the first pointer.

How do you find the last element in a singly linked list?

The last node of a linked list has the reference pointer as NULL. i.e. node=>next = NULL. To find the last node, we have to iterate the linked till the node=>next != NULL.


1 Answers

The key to this algorithm is to set two pointers p1 and p2 apart by n-1 nodes initially so we want p2 to point to the (n-1)th node from the start of the list then we move p2 till it reaches the last node of the list. Once p2 reaches end of the list p1 will be pointing to the nth node from the end of the list.

I've put the explanation inline as comments. Hope it helps:

// Function to return the nth node from the end of a linked list. // Takes the head pointer to the list and n as input // Returns the nth node from the end if one exists else returns NULL. LinkedListNode nthToLast(LinkedListNode head, int n) {   // If list does not exist or if there are no elements in the list,return NULL   if (head == null || n < 1) {     return null;   }    // make pointers p1 and p2 point to the start of the list.   LinkedListNode p1 = head;   LinkedListNode p2 = head;    // The key to this algorithm is to set p1 and p2 apart by n-1 nodes initially   // so we want p2 to point to the (n-1)th node from the start of the list   // then we move p2 till it reaches the last node of the list.    // Once p2 reaches end of the list p1 will be pointing to the nth node    // from the end of the list.    // loop to move p2.   for (int j = 0; j < n - 1; ++j) {     // while moving p2 check if it becomes NULL, that is if it reaches the end    // of the list. That would mean the list has less than n nodes, so its not     // possible to find nth from last, so return NULL.    if (p2 == null) {        return null;     }    // move p2 forward.    p2 = p2.next;   }    // at this point p2 is (n-1) nodes ahead of p1. Now keep moving both forward   // till p2 reaches the last node in the list.   while (p2.next != null) {     p1 = p1.next;     p2 = p2.next;   }     // at this point p2 has reached the last node in the list and p1 will be    // pointing to the nth node from the last..so return it.    return p1;  } 

Alternatively we can set p1 and p2 apart by n nodes instead of (n-1) and then move p2 till the end of the list instead of moving till the last node:

LinkedListNode p1 = head; LinkedListNode p2 = head; for (int j = 0; j < n ; ++j) { // make then n nodes apart.     if (p2 == null) {         return null;     }     p2 = p2.next; } while (p2 != null) { // move till p2 goes past the end of the list.     p1 = p1.next;     p2 = p2.next; } return p1; 
like image 133
codaddict Avatar answered Sep 18 '22 08:09

codaddict