Given a linked list containing N nodes and a positive integer k should be less than or equal to N. The task is to print the last k nodes of the list in reverse order.
Examples:
Input: list: 1->2->3->4->5, k = 2 Output: 5 4 Input: list: 3->10->6->9->12->2->8, k = 4 Output: 8 2 12 9
Source: Amazon Interview Experience SDE Off Campus.
Recursive Approach: Recursively traverse the linked list. When returning from each recursive call keep track of the node number, considering the last node as number 1, second last as number 2 and so on. This counting could be tracked with the help of a global or pointer variable. With the help of this count variable, print the nodes having a node number less than or equal to k.
Below is the implementation of the above approach:
C++
// C++ implementation to print the last k nodes // of linked list in reverse order #include <bits/stdc++.h> using namespace std; // Structure of a node struct Node { int data; Node* next; }; // Function to get a new node Node* getNode( int data) { // allocate space Node* newNode = new Node; // put in data newNode->data = data; newNode->next = NULL; return newNode; } // Function to print the last k nodes // of linked list in reverse order void printLastKRev(Node* head, int & count, int k) { // if list is empty if (!head) return ; // Recursive call with the next node // of the list printLastKRev(head->next, count, k); // Count variable to keep track of // the last k nodes count++; // Print data if (count <= k) cout << head->data << " " ; } // Driver code int main() { // Create list: 1->2->3->4->5 Node* head = getNode(1); head->next = getNode(2); head->next->next = getNode(3); head->next->next->next = getNode(4); head->next->next->next->next = getNode(5); int k = 4, count = 0; // print the last k nodes printLastKRev(head, count, k); return 0; } |
Java
// Java implementation to print the last k nodes // of linked list in reverse order class GfG { // Structure of a node 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; } static class C { int count = 0 ; } // Function to print the last k nodes // of linked list in reverse order static void printLastKRev(Node head, C c, int k) { // if list is empty if (head == null ) return ; // Recursive call with the next node // of the list printLastKRev(head.next, c, k); // Count variable to keep track of // the last k nodes c.count++; // Print data if (c.count <= k) System.out.print(head.data + " " ); } // Driver code public static void main(String[] args) { // Create list: 1->2->3->4->5 Node head = getNode( 1 ); head.next = getNode( 2 ); head.next.next = getNode( 3 ); head.next.next.next = getNode( 4 ); head.next.next.next.next = getNode( 5 ); int k = 4 ; C c = new C(); // print the last k nodes printLastKRev(head, c, k); } } // This code is contributed by prerna saini |
Python
# Python implementation to print the last k nodes # of linked list in reverse order # Node class class Node: # Function to initialise the node object def __init__( self , data): self .data = data # Assign data 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 class C: def __init__( self , data): self .count = data # Function to print the last k nodes # of linked list in reverse order def printLastKRev(head, c, k): # if list is empty if (head = = None ): return # Recursive call with the next node # of the list printLastKRev(head. next , c, k) # Count variable to keep track of # the last k nodes c.count = c.count + 1 # Print data if (c.count < = k) : print (head.data, end = " " ) # Driver code # Create list: 1->2->3->4->5 head = getNode( 1 ) head. next = getNode( 2 ) head. next . next = getNode( 3 ) head. next . next . next = getNode( 4 ) head. next . next . next . next = getNode( 5 ) k = 4 c = C( 0 ) # print the last k nodes printLastKRev(head, c, k) # This code is contributed by Arnab Kundu |
C#
// C# implementation to print the last k // nodes of linked list in reverse order using System; class GFG { // Structure of a node public 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; } public class C { public int count = 0; } // Function to print the last k nodes // of linked list in reverse order static void printLastKRev(Node head, C c, int k) { // if list is empty if (head == null ) return ; // Recursive call with the next // node of the list printLastKRev(head.next, c, k); // Count variable to keep track // of the last k nodes c.count++; // Print data if (c.count <= k) Console.Write(head.data + " " ); } // Driver code public static void Main(String []args) { // Create list: 1->2->3->4->5 Node head = getNode(1); head.next = getNode(2); head.next.next = getNode(3); head.next.next.next = getNode(4); head.next.next.next.next = getNode(5); int k = 4; C c = new C(); // print the last k nodes printLastKRev(head, c, k); } } // This code is contributed by Arnab Kundu |
Javascript
<script> // Javascript implementation of the approach // Structure of a node 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; } class C { constructor() { this .count = 0; } } // Function to print the last k nodes // of linked list in reverse order function printLastKRev( head, c, k) { // if list is empty if (head == null ) return ; // Recursive call with the next node // of the list printLastKRev(head.next, c, k); // Count variable to keep track of // the last k nodes c.count++; // Print data if (c.count <= k) document.write(head.data + " " ); } // Driver Code // Create list: 1->2->3->4->5 var head = getNode(1); head.next = getNode(2); head.next.next = getNode(3); head.next.next.next = getNode(4); head.next.next.next.next = getNode(5); let k = 4; let c = new C(); // print the last k nodes printLastKRev(head, c, k); // This code is contributed by jana_sayantan. </script> |
5 4 3 2
Time Complexity: O(n).
Iterative Approach: The idea is to use Stack Data Structure.
- Push all linked list nodes to a stack.
- Pop k nodes from the stack and print them.
Time Complexity: O(n).
Two Pointer Approach The idea is similar to find k-th node from end of linked list.
- Move first pointer k nodes ahead.
- Now start another pointer, second from head.
- When first pointer reaches end, second pointer points to k-th node.
- Finally using the second pointer, print last k nodes.
Time Complexity: O(n).
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!