Related Articles

Related Articles

Move last element to front of a given Linked List | Set 2
  • Last Updated : 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 = 3
Output : 4 -> 5 -> 6 -> 1 -> 2 -> 3

Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6, k = 7
Output : 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 :

      filter_none

      edit
      close

      play_arrow

      link
      brightness_4
      code

      // 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 front
      void 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); 
      }

      chevron_right

      
      

      Output:

      Linked List before appending: 1 2 3 4 5 6 
      Linked List after appending 7 elements: 6 1 2 3 4 5 
      

      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.




      My Personal Notes arrow_drop_up
Recommended Articles
Page :