Related Articles

# Append the last M nodes to the beginning of the given linked list

• Difficulty Level : Medium
• Last Updated : 18 Jun, 2021

Given a linked list and an integer M, the task is to append the last M nodes of the linked list to the front.
Examples:

Input: List = 4 -> 5 -> 6 -> 1 -> 2 -> 3 -> NULL, M = 3
Output: 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL
Input: List = 8 -> 7 -> 0 -> 4 -> 1 -> NULL, M = 2
Output: 4 -> 1 -> 8 -> 7 -> 0 -> NULL

Approach: Find the first node of the last M nodes in the list, this node will be the new head node so make the next pointer of the previous node as NULL and point the last node of the original list to the head of the original list. Finally, print the updated list.
Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `// Class for a node of``// the linked list``struct` `Node``{` `    ``// Data and the pointer``    ``// to the next node``    ``int` `data;``    ``Node *next;``    ``Node(``int` `data)``    ``{``        ``this``->data = data;``        ``this``->next = NULL;``    ``}``};` `// Function to print the linked list``void` `printList(Node* node)``{``  ``while` `(node != NULL)``  ``{``    ``cout << (node->data) << ``" -> "``;``    ``node = node->next;``  ``}``  ``cout << ``"NULL"``;``}` `// Recursive function to return the``// count of nodes in the linked list``int` `cntNodes(Node* node)``{``  ``if` `(node == NULL)``    ``return` `0;` `  ``return` `(1 + cntNodes(node->next));``}` `// Function to update and print``// the updated list nodes``void` `updateList(Node* head, ``int` `m)``{` `  ``// Total nodes in the list``  ``int` `cnt = cntNodes(head);` `  ``if` `(cnt != m && m < cnt)``  ``{` `    ``// Count of nodes to be skipped``    ``// from the beginning``    ``int` `skip = cnt - m;``    ``Node *prev = NULL;``    ``Node *curr = head;` `    ``// Skip the nodes``    ``while` `(skip > 0)``    ``{``      ``prev = curr;``      ``curr = curr->next;``      ``skip--;``    ``}` `    ``// Change the pointers``    ``prev->next = NULL;``    ``Node *tempHead = head;``    ``head = curr;` `    ``// Find the last node``    ``while` `(curr->next != NULL)``      ``curr = curr->next;` `    ``// Connect it to the head``    ``// of the sub list``    ``curr->next = tempHead;``  ``}` `  ``// Print the updated list``  ``printList(head);``}` `// Driver code``int` `main()``{` `  ``// Create the list``  ``Node* head = ``new` `Node(4);``  ``head->next = ``new` `Node(5);``  ``head->next->next = ``new` `Node(6);``  ``head->next->next->next = ``new` `Node(1);``  ``head->next->next->next->next = ``new` `Node(2);``  ``head->next->next->next->next->next = ``new` `Node(3);``  ``int` `m = 3;``  ``updateList(head, m);``  ``return` `0;``}` `// This code is contributed by rutvik_56`

## Java

 `// Java implementation of the approach``class` `GFG {` `    ``// Class for a node of``    ``// the linked list``    ``static` `class` `Node {` `        ``// Data and the pointer``        ``// to the next node``        ``int` `data;``        ``Node next;` `        ``Node(``int` `data)``        ``{``            ``this``.data = data;``            ``this``.next = ``null``;``        ``}``    ``}` `    ``// Function to print the linked list``    ``static` `void` `printList(Node node)``    ``{``        ``while` `(node != ``null``) {``            ``System.out.print(node.data + ``" -> "``);``            ``node = node.next;``        ``}``        ``System.out.print(``"NULL"``);``    ``}` `    ``// Recursive function to return the``    ``// count of nodes in the linked list``    ``static` `int` `cntNodes(Node node)``    ``{``        ``if` `(node == ``null``)``            ``return` `0``;` `        ``return` `(``1` `+ cntNodes(node.next));``    ``}` `    ``// Function to update and print``    ``// the updated list nodes``    ``static` `void` `updateList(Node head, ``int` `m)``    ``{` `        ``// Total nodes in the list``        ``int` `cnt = cntNodes(head);` `        ``if` `(cnt != m && m < cnt) {` `            ``// Count of nodes to be skipped``            ``// from the beginning``            ``int` `skip = cnt - m;``            ``Node prev = ``null``;``            ``Node curr = head;` `            ``// Skip the nodes``            ``while` `(skip > ``0``) {``                ``prev = curr;``                ``curr = curr.next;``                ``skip--;``            ``}` `            ``// Change the pointers``            ``prev.next = ``null``;``            ``Node tempHead = head;``            ``head = curr;` `            ``// Find the last node``            ``while` `(curr.next != ``null``)``                ``curr = curr.next;` `            ``// Connect it to the head``            ``// of the sub list``            ``curr.next = tempHead;``        ``}` `        ``// Print the updated list``        ``printList(head);``    ``}` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{` `        ``// Create the list``        ``Node head = ``new` `Node(``4``);``        ``head.next = ``new` `Node(``5``);``        ``head.next.next = ``new` `Node(``6``);``        ``head.next.next.next = ``new` `Node(``1``);``        ``head.next.next.next.next = ``new` `Node(``2``);``        ``head.next.next.next.next.next = ``new` `Node(``3``);` `        ``int` `m = ``3``;` `        ``updateList(head, m);``    ``}``}`

## Python3

 `# Python3 implementation of the approach` `# Class for a node of``# the linked list``class` `newNode:``    ` `    ``# Constructor to initialize the node object``    ``def` `__init__(``self``, data):``        ``self``.data ``=` `data``        ``self``.``next` `=` `None` `# Function to print the linked list``def` `printList(node):``    ` `    ``while` `(node !``=` `None``):``        ``print``(node.data,``"->"``, end``=``" "``)``        ``node ``=` `node.``next``    ``print``(``"NULL"``)` `# Recursive function to return the``# count of nodes in the linked list``def` `cntNodes(node):``    ``if` `(node ``=``=` `None``):``        ``return` `0``        ` `    ``return` `(``1` `+` `cntNodes(node.``next``))``    ` `# Function to update and print``# the updated list nodes``def` `updateList(head, m):``    ` `    ``# Total nodes in the list``    ``cnt ``=` `cntNodes(head)``    ` `    ``if` `(cnt !``=` `m ``and` `m < cnt):``        ` `        ``# Count of nodes to be skipped``        ``# from the beginning``        ``skip ``=` `cnt ``-` `m``        ``prev ``=` `None``        ` `        ``curr ``=` `head``        ` `        ``# Skip the nodes``        ``while` `(skip > ``0``):``            ``prev ``=` `curr``            ``curr ``=` `curr.``next``            ``skip``-``=``1``            ` `        ``# Change the pointers``        ``prev.``next` `=` `None``        ``tempHead ``=` `head``        ``head ``=` `curr``        ` `        ``# Find the last node``        ``while` `(curr.``next` `!``=` `None``):``            ``curr ``=` `curr.``next``            ` `        ``# Connect it to the head``        ``# of the sub list``        ``curr.``next` `=` `tempHead``    ` `    ``# Print the updated list``    ``printList(head)` `# Driver code` `# Create the list``head ``=` `newNode(``4``)``head.``next` `=` `newNode(``5``)``head.``next``.``next` `=` `newNode(``6``)``head.``next``.``next``.``next` `=` `newNode(``1``)``head.``next``.``next``.``next``.``next` `=` `newNode(``2``)``head.``next``.``next``.``next``.``next``.``next` `=` `newNode(``3``)` `m ``=` `3` `updateList(head, m)` `# This code is contributed by shubhamsingh10`

## C#

 `// C# implementation of the approach``using` `System;` `class` `GFG``{` `    ``// Class for a node of``    ``// the linked list``    ``class` `Node``    ``{` `        ``// Data and the pointer``        ``// to the next node``        ``public` `int` `data;``        ``public` `Node next;` `        ``public` `Node(``int` `data)``        ``{``            ``this``.data = data;``            ``this``.next = ``null``;``        ``}``    ``}` `    ``// Function to print the linked list``    ``static` `void` `printList(Node node)``    ``{``        ``while` `(node != ``null``)``        ``{``            ``Console.Write(node.data + ``" -> "``);``            ``node = node.next;``        ``}``        ``Console.Write(``"NULL"``);``    ``}` `    ``// Recursive function to return the``    ``// count of nodes in the linked list``    ``static` `int` `cntNodes(Node node)``    ``{``        ``if` `(node == ``null``)``            ``return` `0;` `        ``return` `(1 + cntNodes(node.next));``    ``}` `    ``// Function to update and print``    ``// the updated list nodes``    ``static` `void` `updateList(Node head, ``int` `m)``    ``{` `        ``// Total nodes in the list``        ``int` `cnt = cntNodes(head);` `        ``if` `(cnt != m && m < cnt)``        ``{` `            ``// Count of nodes to be skipped``            ``// from the beginning``            ``int` `skip = cnt - m;``            ``Node prev = ``null``;``            ``Node curr = head;` `            ``// Skip the nodes``            ``while` `(skip > 0)``            ``{``                ``prev = curr;``                ``curr = curr.next;``                ``skip--;``            ``}` `            ``// Change the pointers``            ``prev.next = ``null``;``            ``Node tempHead = head;``            ``head = curr;` `            ``// Find the last node``            ``while` `(curr.next != ``null``)``                ``curr = curr.next;` `            ``// Connect it to the head``            ``// of the sub list``            ``curr.next = tempHead;``        ``}` `        ``// Print the updated list``        ``printList(head);``    ``}` `    ``// Driver code``    ``public` `static` `void` `Main(String[] args)``    ``{` `        ``// Create the list``        ``Node head = ``new` `Node(4);``        ``head.next = ``new` `Node(5);``        ``head.next.next = ``new` `Node(6);``        ``head.next.next.next = ``new` `Node(1);``        ``head.next.next.next.next = ``new` `Node(2);``        ``head.next.next.next.next.next = ``new` `Node(3);` `        ``int` `m = 3;` `        ``updateList(head, m);``    ``}``}` `// This code is contributed by PrinciRaj1992`

## Javascript

 ``
Output:
`1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL`

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up