Move last m elements to the front of a given Linked List - GeeksforGeeks

18 Jun, 2021
Given the head of a Singly Linked List and a value m, the task is to move the last m elements to the front. Examples:  
Input: 4->5->6->1->2->3 ; m = 3 Output: 1->2->3->4->5->6Input: 0->1->2->3->4->5 ; m = 4 Output: 2->3->4->5->0->1  
 
Algorithm:  
Use two pointers: one to store the address of the last node and other for the address of the first node.Traverse the list till the first node of last m nodes.Maintain two pointers p, q i.e., p as the first node of last m nodes & q as just before node of p.Make the last node next as the original list head.Make the next of node q as NULL.Set the p as the head.
Use two pointers: one to store the address of the last node and other for the address of the first node.
Traverse the list till the first node of last m nodes.
Maintain two pointers p, q i.e., p as the first node of last m nodes & q as just before node of p.
Make the last node next as the original list head.
Make the next of node q as NULL.
Set the p as the head.
Below is the implementation of the above approach.  
C++
C
Java
Python3
C#
Javascript
// C++ Program to move last m elements// to front in a given linked list#include <iostream>using namespace std; // A linked list nodestruct Node{    int data;    struct Node* next;} * first, *last; int length = 0; // Function to print nodes// in a given linked listvoid printList(struct Node* node){    while (node != NULL)    {        cout << node->data <<" ";        node = node->next;    }} // Pointer head and p are being// used here because, the head// of the linked list is changed in this function.void moveToFront(struct Node* head,                struct Node* p, int m){    // If the linked list is empty,    // or it contains only one node,    // then nothing needs to be done, simply return    if (head == NULL)        return;     p = head;    head = head->next;    m++;     // if m value reaches length,    // the recursion will end    if (length == m)    {         // breaking the link        p->next = NULL;         // connecting last to first &        // will make another node as head        last->next = first;         // Making the first node of        // last m nodes as root        first = head;    }    else        moveToFront(head, p, m);} // UTILITY FUNCTIONS // Function to add a node at// the beginning of Linked Listvoid push(struct Node** head_ref,        int new_data){    // allocate node    struct Node* new_node = (struct Node*)        malloc(sizeof(struct Node));     // put in the data    new_node->data = new_data;     // link the old list off the new node    new_node->next = (*head_ref);     // move the head to point to the new node    (*head_ref) = new_node;     // making first & last nodes    if (length == 0)        last = *head_ref;    else        first = *head_ref;     // increase the length    length++;} // Driver codeint main(){    struct Node* start = NULL;     // The constructed linked list is:    // 1->2->3->4->5    push(&start, 5);    push(&start, 4);    push(&start, 3);    push(&start, 2);    push(&start, 1);    push(&start, 0);     cout << "Initial Linked list\n";    printList(start);    int m = 4; // no.of nodes to change    struct Node* temp;    moveToFront(start, temp, m);     cout << "\n Final Linked list\n";    start = first;    printList(start);     return 0;} // This code is contributed by SHUBHAMSINGH10
// C Program to move last m elements// to front in a given linked list#include <stdio.h>#include <stdlib.h> // A linked list nodestruct Node {    int data;    struct Node* next;} * first, *last; int length = 0; // Function to print nodes// in a given linked listvoid printList(struct Node* node){    while (node != NULL) {        printf("%d ", node->data);        node = node->next;    }} // Pointer head and p are being// used here because, the head// of the linked list is changed in this function.void moveToFront(struct Node* head,                 struct Node* p, int m){    // If the linked list is empty,    // or it contains only one node,    // then nothing needs to be done, simply return    if (head == NULL)        return;     p = head;    head = head->next;    m++;     // if m value reaches length,    // the recursion will end    if (length == m) {         // breaking the link        p->next = NULL;         // connecting last to first &        // will make another node as head        last->next = first;         // Making the first node of        // last m nodes as root        first = head;    }    else        moveToFront(head, p, m);} // UTILITY FUNCTIONS // Function to add a node at// the beginning of Linked Listvoid push(struct Node** head_ref,          int new_data){    // allocate node    struct Node* new_node = (struct Node*)        malloc(sizeof(struct Node));     // put in the data    new_node->data = new_data;     // link the old list off the new node    new_node->next = (*head_ref);     // move the head to point to the new node    (*head_ref) = new_node;     // making first & last nodes    if (length == 0)        last = *head_ref;    else        first = *head_ref;     // increase the length    length++;} // Driver codeint main(){    struct Node* start = NULL;     // The constructed linked list is:    // 1->2->3->4->5    push(&start, 5);    push(&start, 4);    push(&start, 3);    push(&start, 2);    push(&start, 1);    push(&start, 0);     printf("\n Initial Linked list\n");    printList(start);    int m = 4; // no.of nodes to change    struct Node* temp;    moveToFront(start, temp, m);     printf("\n Final Linked list\n");    start = first;    printList(start);     return 0;}
// Java Program to move last m elements// to front in a given linked listclass GFG{    // A linked list node    static class Node    {        int data;        Node next;    }     static Node first, last;     static int length = 0;     // Function to print nodes    // in a given linked list    static void printList(Node node)    {        while (node != null)        {            System.out.printf("%d ", node.data);            node = node.next;        }    }     // Pointer head and p are being    // used here because, the head    // of the linked list is changed in this function.    static void moveToFront(Node head, Node p, int m)    {        // If the linked list is empty,        // or it contains only one node,        // then nothing needs to be done, simply return        if (head == null)            return;         p = head;        head = head.next;        m++;         // if m value reaches length,        // the recursion will end        if (length == m)        {             // breaking the link            p.next = null;             // connecting last to first &            // will make another node as head            last.next = first;             // Making the first node of            // last m nodes as root            first = head;        }        else            moveToFront(head, p, m);    }     // UTILITY FUNCTIONS     // Function to add a node at    // the beginning of Linked List    static Node push(Node head_ref, int new_data)    {        // allocate node        Node new_node = new Node();         // put in the data        new_node.data = new_data;         // link the old list off the new node        new_node.next = head_ref;         // move the head to point to the new node        head_ref = new_node;         // making first & last nodes        if (length == 0)            last = head_ref;        else            first = head_ref;         // increase the length        length++;        return head_ref;    }     // Driver code    public static void main(String[] args)    {        Node start = null;         // The constructed linked list is:        // 1.2.3.4.5        start = push(start, 5);        start = push(start, 4);        start = push(start, 3);        start = push(start, 2);        start = push(start, 1);        start = push(start, 0);         System.out.printf("\n Initial Linked list\n");        printList(start);        int m = 4; // no.of nodes to change        Node temp = new Node();        moveToFront(start, temp, m);         System.out.printf("\n Final Linked list\n");        start = first;        printList(start);    }} // This code is contributed by 29AjayKumar
# Python Program to move last m elements# to front in a given linked list # A linked list nodeclass Node :    def __init__(self):        self.data = 0        self.next = None         first = Nonelast = None length = 0 # Function to print nodes# in a given linked listdef printList( node):     while (node != None) :        print( node.data, end=" ")        node = node.next     # Pointer head and p are being# used here because, the head# of the linked list is changed in this function.def moveToFront( head, p, m):         global first    global last    global length         # If the linked list is empty,    # or it contains only one node,    # then nothing needs to be done, simply return    if (head == None):        return head     p = head    head = head.next    m= m + 1     # if m value reaches length,    # the recursion will end    if (length == m) :             # breaking the link        p.next = None         # connecting last to first &        # will make another node as head        last.next = first                 # Making the first node of        # last m nodes as root        first = head         else:        moveToFront(head, p, m)         # UTILITY FUNCTIONS # Function to add a node at# the beginning of Linked Listdef push( head_ref, new_data):         global first    global last    global length         # allocate node    new_node = Node()         # put in the data    new_node.data = new_data     # link the old list off the new node    new_node.next = (head_ref)     # move the head to point to the new node    (head_ref) = new_node         # making first & last nodes    if (length == 0):        last = head_ref    else:        first = head_ref     # increase the length    length= length + 1         return head_ref # Driver code start = None # The constructed linked list is:# 1.2.3.4.5start = push(start, 5)start = push(start, 4)start = push(start, 3)start = push(start, 2)start = push(start, 1)start = push(start, 0) print("\n Initial Linked list")printList(start)m = 4 # no.of nodes to changetemp = NonemoveToFront(start, temp, m) print("\n Final Linked list")start = firstprintList(start) # This code is contributed by Arnab Kundu
// C# Program to move last m elements// to front in a given linked listusing System; class GFG{    // A linked list node    class Node    {        public int data;        public Node next;    }     static Node first, last;     static int length = 0;     // Function to print nodes    // in a given linked list    static void printList(Node node)    {        while (node != null)        {            Console.Write("{0} ", node.data);            node = node.next;        }    }     // Pointer head and p are being used here    // because, the head of the linked list    // is changed in this function.    static void moveToFront(Node head,                            Node p, int m)    {        // If the linked list is empty,        // or it contains only one node,        // then nothing needs to be done,        // simply return        if (head == null)            return;         p = head;        head = head.next;        m++;         // if m value reaches length,        // the recursion will end        if (length == m)        {             // breaking the link            p.next = null;             // connecting last to first &            // will make another node as head            last.next = first;             // Making the first node of            // last m nodes as root            first = head;        }        else            moveToFront(head, p, m);    }     // UTILITY FUNCTIONS     // Function to add a node at    // the beginning of Linked List    static Node push(Node head_ref, int new_data)    {        // allocate node        Node new_node = new Node();         // put in the data        new_node.data = new_data;         // link the old list off the new node        new_node.next = head_ref;         // move the head to point to the new node        head_ref = new_node;         // making first & last nodes        if (length == 0)            last = head_ref;        else            first = head_ref;         // increase the length        length++;        return head_ref;    }     // Driver code    public static void Main(String[] args)    {        Node start = null;         // The constructed linked list is:        // 1.2.3.4.5        start = push(start, 5);        start = push(start, 4);        start = push(start, 3);        start = push(start, 2);        start = push(start, 1);        start = push(start, 0);         Console.Write("Initial Linked list\n");        printList(start);        int m = 4; // no.of nodes to change        Node temp = new Node();        moveToFront(start, temp, m);         Console.Write("\nFinal Linked list\n");        start = first;        printList(start);    }} // This code is contributed by PrinciRaj1992
<script>      // JavaScript Program to move last m elements      // to front in a given linked list      // A linked list node      class Node {        constructor() {          this.data = 0;          this.next = null;        }      }       var first, last;       var length = 0;       // Function to print nodes      // in a given linked list      function printList(node) {        while (node != null) {          document.write(node.data + " ");          node = node.next;        }      }       // Pointer head and p are being used here      // because, the head of the linked list      // is changed in this function.      function moveToFront(head, p, m) {        // If the linked list is empty,        // or it contains only one node,        // then nothing needs to be done,        // simply return        if (head == null) return;         p = head;        head = head.next;        m++;         // if m value reaches length,        // the recursion will end        if (length == m) {          // breaking the link          p.next = null;           // connecting last to first &          // will make another node as head          last.next = first;           // Making the first node of          // last m nodes as root          first = head;        } else moveToFront(head, p, m);      }       // UTILITY FUNCTIONS       // Function to add a node at      // the beginning of Linked List      function push(head_ref, new_data) {        // allocate node        var new_node = new Node();         // put in the data        new_node.data = new_data;         // link the old list off the new node        new_node.next = head_ref;         // move the head to point to the new node        head_ref = new_node;         // making first & last nodes        if (length == 0) last = head_ref;        else first = head_ref;         // increase the length        length++;        return head_ref;      }       // Driver code      var start = null;       // The constructed linked list is:      // 1.2.3.4.5      start = push(start, 5);      start = push(start, 4);      start = push(start, 3);      start = push(start, 2);      start = push(start, 1);      start = push(start, 0);       document.write("Initial Linked list <br>");      printList(start);      var m = 4; // no.of nodes to change      var temp = new Node();      moveToFront(start, temp, m);       document.write("<br> Final Linked list <br>");      start = first;      printList(start);             // This code is contributed by rdtank.    </script>
Initial Linked list
0 1 2 3 4 5 
 Final Linked list
2 3 4 5 0 1
 
29AjayKumar
princiraj1992
andrew1234
SHUBHAMSINGH10
rdtank
Linked List
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Circular Singly Linked List | Insertion
Given a linked list which is sorted, how will you insert in sorted way
Swap nodes in a linked list without swapping data
Delete a node in a Doubly Linked List
Circular Linked List | Set 2 (Traversal)
Insert a node at a specific position in a linked list
Program to implement Singly Linked List in C++ using class
Priority Queue using Linked List
Insertion Sort for Singly Linked List
Real-time application of Data Structures