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 :
C++
// 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); } |
Java
// JAVA Program to move k last elements // to front in a given linked list import java.io.*;class Node { int data; Node next; Node(int data) { this.data = data; this.next = null; }}class LinkedList { Node head; Node tail; // Function to add a new node at the end/tail of Linked // List public void insertAtTail(int data) { Node newnode = new Node(data); if (tail == null) { tail = head = newnode; return; } tail.next = newnode; tail = newnode; } // Function to add a node at the beginning of Linked // List public void insertAtHead(Node deletedNode) { if (head == null) { head = tail = deletedNode; return; } deletedNode.next = head; head = deletedNode; } // Function to delete a node at the end of Linked List public Node deleteAtTail() { 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 public void appendAtFront(int n, int k) { k = k % n; while (k != 0) { Node deleted = deleteAtTail(); insertAtHead(deleted); k--; } } // Function to print nodes in a given linked list public void printLinkedList() { Node temp = head; while (temp != null) { System.out.print(temp.data + " "); temp = temp.next; } System.out.println(); }}class GFG { public static void main(String[] args) { LinkedList ll = new LinkedList(); ll.insertAtTail(1); ll.insertAtTail(2); ll.insertAtTail(3); ll.insertAtTail(4); ll.insertAtTail(5); ll.insertAtTail(6); System.out.print("Linked List before appending: "); ll.printLinkedList(); int k = 7; ll.appendAtFront(6, k); System.out.print("Linked List after appending " + k + " elements: "); ll.printLinkedList(); }}// This code is contributed by lokesh. |
Linked List before appending: 1 2 3 4 5 6 Linked List after appending 7 elements: 6 1 2 3 4 5
Time Complexity: O(N)
Auxiliary Space: O(1)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More on that Topic: geeksforgeeks.org/move-last-element-to-front-of-a-given-linked-list-set-2/ […]