Move last element to front of a given Linked List | Set 2

07 Aug, 2019
Given a singly linked list and an integer K. The task is to append last K elements of the linked list to front.
Examples:
Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6, k = 3Output : 4 -> 5 -> 6 -> 1 -> 2 -> 3
Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6, k = 7Output : 6 -> 1 -> 2 -> 3 -> 4 -> 5
Prerequisites: Move last element to front of a given Linked List
Approach:
Loop over (k % n) times, Where n is the number of elements of the linked list.
Each time, delete one node from the end of the linked list.
Simultaneously insert that deleted node at the beginning of the linked list.
Below is the implementation of the above approach :
// CPP Program to move k last elements // to front in a given linked list #include<iostream>using namespace std;  // A linked list node class Node{    public:          int data;    Node* next;    Node(int d) {        data = d;        next = NULL;    }};  // Function to add a new node at the// end/tail of Linked List void insertAtTail(Node*& head, Node*& tail, int d ) {    Node* newnode = new Node(d);    if(tail == NULL) {        tail = head = newnode;        return;    }      tail->next = newnode;    tail = newnode;}  // Function to add a node at the// beginning of Linked List void insertAtHead(Node*& head, Node*& tail,                            Node*& deletedNode) {    if(head == NULL) {        head = tail = deletedNode;        return;    }    deletedNode->next = head;    head = deletedNode;    return;}  // Function to add a node at the beginning of Linked List Node* deleteAtTail(Node*& head, Node*& tail) {    Node* deleted = tail;    Node* temp = head;      while(temp->next->next != NULL) {        temp = temp->next;    }      temp->next = NULL;    tail = temp;    return deleted;}  // k can be more than n, so this function takes the modulus // of k with n and delete nodes from end k // times and simultaneously insert it in frontvoid appendAtFront(Node*& head, Node*& tail, int n, int k) {    k = k % n;    while(k != 0) {        Node* deleted = deleteAtTail(head, tail);        insertAtHead(head, tail, deleted);        k--;    }}  // Function to print nodes in a given linked list void printLinkedList(Node* head) {    while(head != NULL) {        cout << head->data << " ";        head = head->next;    }    cout << endl;}  // Driver Code int main() {    // Pointer to the start of the linked list    Node* head = NULL;          // Pointer to the end of the linked list    Node* tail = NULL;           // Number of elements in the linked list    int n = 6;           // Building linked list    insertAtTail(head, tail, 1);    insertAtTail(head, tail, 2);    insertAtTail(head, tail, 3);    insertAtTail(head, tail, 4);    insertAtTail(head, tail, 5);    insertAtTail(head, tail, 6);                // Printing linked list before     // appending the linked list    cout << "Linked List before appending: ";    printLinkedList(head);          // Number of elements to be appended    int k = 7;          // Function call    appendAtFront(head, tail, n, k);           // Printing linked list after appending the list    cout << "Linked List after appending "<<k<<" elements: ";    printLinkedList(head); }
Linked List before appending: 1 2 3 4 5 6 
Linked List after appending 7 elements: 6 1 2 3 4 5 

Linked List
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Introduction to Data Structures
What is Data Structure: Types, Classifications and Applications
Add two numbers represented by linked lists | Set 2
Circular Singly Linked List | Insertion
Types of Linked List
Find first node of loop in a linked list
Real-time application of Data Structures
Flattening a Linked List
Insert a node at a specific position in a linked list
Given a linked list which is sorted, how will you insert in sorted way