Related Articles
Append the last M nodes to the beginning of the given linked list
• Difficulty Level : Medium
• Last Updated : 23 Dec, 2020

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`
Output:
`1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL`

My Personal Notes arrow_drop_up