Move all occurrences of an element to end in a linked list - GeeksforGeeks

10 Mar, 2022
Given a linked list and a key in it, the task is to move all occurrences of the given key to the end of the linked list, keeping the order of all other elements the same.
Examples:  
Input  : 1 -> 2 -> 2 -> 4 -> 3
         key = 2 
Output : 1 -> 4 -> 3 -> 2 -> 2

Input  : 6 -> 6 -> 7 -> 6 -> 3 -> 10
         key = 6
Output : 7 -> 3 -> 10 -> 6 -> 6 -> 6
A simple solution is to one by one find all occurrences of a given key in the linked list. For every found occurrence, insert it at the end. We do it till all occurrences of the given key are moved to the end.
Time Complexity: O(n2)
Efficient Solution 1: is to keep two pointers: pCrawl => Pointer to traverse the whole list one by one. pKey => Pointer to an occurrence of the key if a key is found. Else same as pCrawl.We start both of the above pointers from the head of the linked list. We move pKey only when pKey is not pointing to a key. We always move pCrawl. So, when pCrawl and pKey are not the same, we must have found a key that lies before pCrawl, so we swap between pCrawl and pKey, and move pKey to the next location. The loop invariant is, after swapping of data, all elements from pKey to pCrawl are keys.
Below is the implementation of this approach.  
C++
Java
Python3
C#
Javascript
// C++ program to move all occurrences of a// given key to end.#include <bits/stdc++.h> // A Linked list Nodestruct Node {    int data;    struct Node* next;}; // A utility function to create a new node.struct Node* newNode(int x){    Node* temp = new Node;    temp->data = x;    temp->next = NULL;} // Utility function to print the elements// in Linked listvoid printList(Node* head){    struct Node* temp = head;    while (temp != NULL) {        printf("%d ", temp->data);        temp = temp->next;    }    printf("\n");} // Moves all occurrences of given key to// end of linked list.void moveToEnd(Node* head, int key){    // Keeps track of locations where key    // is present.    struct Node* pKey = head;     // Traverse list    struct Node* pCrawl = head;    while (pCrawl != NULL) {        // If current pointer is not same as pointer        // to a key location, then we must have found        // a key in linked list. We swap data of pCrawl        // and pKey and move pKey to next position.        if (pCrawl != pKey && pCrawl->data != key) {            pKey->data = pCrawl->data;            pCrawl->data = key;            pKey = pKey->next;        }         // Find next position where key is present        if (pKey->data != key)            pKey = pKey->next;         // Moving to next Node        pCrawl = pCrawl->next;    }} // Driver codeint main(){    Node* head = newNode(10);    head->next = newNode(20);    head->next->next = newNode(10);    head->next->next->next = newNode(30);    head->next->next->next->next = newNode(40);    head->next->next->next->next->next = newNode(10);    head->next->next->next->next->next->next = newNode(60);     printf("Before moveToEnd(), the Linked list is\n");    printList(head);     int key = 10;    moveToEnd(head, key);     printf("\nAfter moveToEnd(), the Linked list is\n");    printList(head);     return 0;}
// Java program to move all occurrences of a// given key to end.class GFG {     // A Linked list Node    static class Node {        int data;        Node next;    }     // A utility function to create a new node.    static Node newNode(int x)    {        Node temp = new Node();        temp.data = x;        temp.next = null;        return temp;    }     // Utility function to print the elements    // in Linked list    static void printList(Node head)    {        Node temp = head;        while (temp != null) {            System.out.printf("%d ", temp.data);            temp = temp.next;        }        System.out.printf("\n");    }     // Moves all occurrences of given key to    // end of linked list.    static void moveToEnd(Node head, int key)    {        // Keeps track of locations where key        // is present.        Node pKey = head;         // Traverse list        Node pCrawl = head;        while (pCrawl != null) {            // If current pointer is not same as pointer            // to a key location, then we must have found            // a key in linked list. We swap data of pCrawl            // and pKey and move pKey to next position.            if (pCrawl != pKey && pCrawl.data != key) {                pKey.data = pCrawl.data;                pCrawl.data = key;                pKey = pKey.next;            }             // Find next position where key is present            if (pKey.data != key)                pKey = pKey.next;             // Moving to next Node            pCrawl = pCrawl.next;        }    }     // Driver code    public static void main(String args[])    {        Node head = newNode(10);        head.next = newNode(20);        head.next.next = newNode(10);        head.next.next.next = newNode(30);        head.next.next.next.next = newNode(40);        head.next.next.next.next.next = newNode(10);        head.next.next.next.next.next.next = newNode(60);         System.out.printf("Before moveToEnd(), the Linked list is\n");        printList(head);         int key = 10;        moveToEnd(head, key);         System.out.printf("\nAfter moveToEnd(), the Linked list is\n");        printList(head);    }} // This code is contributed by Arnab Kundu
# Python3 program to move all occurrences of a# given key to end. # Linked List nodeclass Node:    def __init__(self, data):        self.data = data        self.next = None # A utility function to create a new node.def newNode(x):     temp = Node(0)    temp.data = x    temp.next = None    return temp # Utility function to print the elements# in Linked listdef printList( head):     temp = head    while (temp != None) :        print( temp.data,end = " ")        temp = temp.next         print() # Moves all occurrences of given key to# end of linked list.def moveToEnd(head, key):     # Keeps track of locations where key    # is present.    pKey = head     # Traverse list    pCrawl = head    while (pCrawl != None) :                 # If current pointer is not same as pointer        # to a key location, then we must have found        # a key in linked list. We swap data of pCrawl        # and pKey and move pKey to next position.        if (pCrawl != pKey and pCrawl.data != key) :            pKey.data = pCrawl.data            pCrawl.data = key            pKey = pKey.next                 # Find next position where key is present        if (pKey.data != key):            pKey = pKey.next         # Moving to next Node        pCrawl = pCrawl.next         return head # Driver codehead = newNode(10)head.next = newNode(20)head.next.next = newNode(10)head.next.next.next = newNode(30)head.next.next.next.next = newNode(40)head.next.next.next.next.next = newNode(10)head.next.next.next.next.next.next = newNode(60) print("Before moveToEnd(), the Linked list is\n")printList(head) key = 10head = moveToEnd(head, key) print("\nAfter moveToEnd(), the Linked list is\n")printList(head) # This code is contributed by Arnab Kundu
// C# program to move all occurrences of a// given key to end.using System; class GFG {     // A Linked list Node    public class Node {        public int data;        public Node next;    }     // A utility function to create a new node.    static Node newNode(int x)    {        Node temp = new Node();        temp.data = x;        temp.next = null;        return temp;    }     // Utility function to print the elements    // in Linked list    static void printList(Node head)    {        Node temp = head;        while (temp != null) {            Console.Write("{0} ", temp.data);            temp = temp.next;        }        Console.Write("\n");    }     // Moves all occurrences of given key to    // end of linked list.    static void moveToEnd(Node head, int key)    {        // Keeps track of locations where key        // is present.        Node pKey = head;         // Traverse list        Node pCrawl = head;        while (pCrawl != null) {            // If current pointer is not same as pointer            // to a key location, then we must have found            // a key in linked list. We swap data of pCrawl            // and pKey and move pKey to next position.            if (pCrawl != pKey && pCrawl.data != key) {                pKey.data = pCrawl.data;                pCrawl.data = key;                pKey = pKey.next;            }             // Find next position where key is present            if (pKey.data != key)                pKey = pKey.next;             // Moving to next Node            pCrawl = pCrawl.next;        }    }     // Driver code    public static void Main(String[] args)    {        Node head = newNode(10);        head.next = newNode(20);        head.next.next = newNode(10);        head.next.next.next = newNode(30);        head.next.next.next.next = newNode(40);        head.next.next.next.next.next = newNode(10);        head.next.next.next.next.next.next = newNode(60);         Console.Write("Before moveToEnd(), the Linked list is\n");        printList(head);         int key = 10;        moveToEnd(head, key);         Console.Write("\nAfter moveToEnd(), the Linked list is\n");        printList(head);    }} // This code has been contributed by 29AjayKumar
<script> // Javascript program to move all occurrences of a// given key to end.    // A Linked list Node    class Node {        constructor() {               this.data = 0;            this.next = null;        }    }     // A utility function to create a new node.    function newNode(x) {        var temp = new Node();        temp.data = x;        temp.next = null;        return temp;    }     // Utility function to print the elements    // in Linked list    function printList(head) {        var temp = head;        while (temp != null) {            document.write( temp.data+" ");            temp = temp.next;        }        document.write("<br/>");    }     // Moves all occurrences of given key to    // end of linked list.    function moveToEnd(head , key) {        // Keeps track of locations where key        // is present.        var pKey = head;         // Traverse list        var pCrawl = head;        while (pCrawl != null) {            // If current pointer is not same as pointer            // to a key location, then we must have found            // a key in linked list. We swap data of pCrawl            // and pKey and move pKey to next position.            if (pCrawl != pKey && pCrawl.data != key) {                pKey.data = pCrawl.data;                pCrawl.data = key;                pKey = pKey.next;            }             // Find next position where key is present            if (pKey.data != key)                pKey = pKey.next;             // Moving to next Node            pCrawl = pCrawl.next;        }    }     // Driver code             var head = newNode(10);        head.next = newNode(20);        head.next.next = newNode(10);        head.next.next.next = newNode(30);        head.next.next.next.next = newNode(40);        head.next.next.next.next.next = newNode(10);        head.next.next.next.next.next.next = newNode(60);         document.write(        "Before moveToEnd(), the Linked list is<br/>"        );        printList(head);         var key = 10;        moveToEnd(head, key);         document.write(        "<br/>After moveToEnd(), the Linked list is<br/>"        );        printList(head); // This code contributed by umadevi9616 </script>
Output: 
Before moveToEnd(), the Linked list is
10 20 10 30 40 10 60 

After moveToEnd(), the Linked list is
20 30 40 60 10 10 10
Time Complexity: O(n) requires only one traversal of the list.
Efficient Solution 2 : 1. Traverse the linked list and take a pointer at the tail. 2. Now, check for the key and node->data. If they are equal, move the node to last-next, else move ahead.
C++
Java
Python3
C#
Javascript
// C++ code to remove key element to end of linked list#include<bits/stdc++.h>using namespace std; // A Linked list Nodestruct Node{    int data;    struct Node* next;}; // A utility function to create a new node.struct Node* newNode(int x){    Node* temp = new Node;    temp->data = x;    temp->next = NULL;} // Function to remove key to endNode *keyToEnd(Node* head, int key){     // Node to keep pointing to tail    Node* tail = head;    if (head == NULL)    {        return NULL;    }    while (tail->next != NULL)    {        tail = tail->next;    }         // Node to point to last of linked list    Node* last = tail;    Node* current = head;    Node* prev = NULL;         // Node prev2 to point to previous when head.data!=key    Node* prev2 = NULL;         // loop to perform operations to remove key to end    while (current != tail)    {        if (current->data == key && prev2 == NULL)        {            prev = current;            current = current->next;            head = current;            last->next = prev;            last = last->next;            last->next = NULL;            prev = NULL;        }        else        {            if (current->data == key && prev2 != NULL)            {                prev = current;                current = current->next;                prev2->next = current;                last->next = prev;                last = last->next;                last->next = NULL;            }            else if (current != tail)            {                prev2 = current;                current = current->next;            }        }    }    return head;} // Function to display linked listvoid printList(Node* head){    struct Node* temp = head;    while (temp != NULL)    {        printf("%d ", temp->data);        temp = temp->next;    }    printf("\n");}  // Driver Codeint main(){    Node* root = newNode(5);    root->next = newNode(2);    root->next->next = newNode(2);    root->next->next->next = newNode(7);    root->next->next->next->next = newNode(2);    root->next->next->next->next->next = newNode(2);    root->next->next->next->next->next->next = newNode(2);     int key = 2;    cout << "Linked List before operations :";    printList(root);    cout << "\nLinked List after operations :";    root = keyToEnd(root, key);    printList(root);    return 0;} // This code is contributed by Rajout-Ji
// Java code to remove key element to end of linked listimport java.util.*; // Node classclass Node {    int data;    Node next;     public Node(int data)    {        this.data = data;        this.next = null;    }} class gfg {     static Node root;     // Function to remove key to end    public static Node keyToEnd(Node head, int key)    {         // Node to keep pointing to tail        Node tail = head;         if (head == null) {            return null;        }         while (tail.next != null) {            tail = tail.next;        }         // Node to point to last of linked list        Node last = tail;         Node current = head;        Node prev = null;         // Node prev2 to point to previous when head.data!=key        Node prev2 = null;         // loop to perform operations to remove key to end        while (current != tail) {            if (current.data == key && prev2 == null) {                prev = current;                current = current.next;                head = current;                last.next = prev;                last = last.next;                last.next = null;                prev = null;            }            else {                if (current.data == key && prev2 != null) {                    prev = current;                    current = current.next;                    prev2.next = current;                    last.next = prev;                    last = last.next;                    last.next = null;                }                else if (current != tail) {                    prev2 = current;                    current = current.next;                }            }        }        return head;    }     // Function to display linked list    public static void display(Node root)    {        while (root != null) {            System.out.print(root.data + " ");            root = root.next;        }    }     // Driver Code    public static void main(String args[])    {        root = new Node(5);        root.next = new Node(2);        root.next.next = new Node(2);        root.next.next.next = new Node(7);        root.next.next.next.next = new Node(2);        root.next.next.next.next.next = new Node(2);        root.next.next.next.next.next.next = new Node(2);         int key = 2;        System.out.println("Linked List before operations :");        display(root);        System.out.println("\nLinked List after operations :");        root = keyToEnd(root, key);        display(root);    }}
# Python3 code to remove key element to# end of linked list  # A Linked list Nodeclass Node:         def __init__(self, data):                 self.data = data        self.next = None         # A utility function to create a new node.def newNode(x):         temp = Node(x)    return temp # Function to remove key to enddef keyToEnd(head, key):     # Node to keep pointing to tail    tail = head         if (head == None):        return None         while (tail.next != None):        tail = tail.next         # Node to point to last of linked list    last = tail    current = head    prev = None          # Node prev2 to point to previous    # when head.data!=key    prev2 = None          # Loop to perform operations to    # remove key to end    while (current != tail):        if (current.data == key and prev2 == None):            prev = current            current = current.next            head = current            last.next = prev            last = last.next            last.next = None            prev = None         else:            if (current.data == key and prev2 != None):                prev = current                current = current.next                prev2.next = current                last.next = prev                last = last.next                last.next = None                         else if (current != tail):                prev2 = current                current = current.next                     return head # Function to display linked listdef printList(head):     temp = head         while (temp != None):        print(temp.data, end = ' ')        temp = temp.next         print()     # Driver Codeif __name__=='__main__':         root = newNode(5)    root.next = newNode(2)    root.next.next = newNode(2)    root.next.next.next = newNode(7)    root.next.next.next.next = newNode(2)    root.next.next.next.next.next = newNode(2)    root.next.next.next.next.next.next = newNode(2)      key = 2    print("Linked List before operations :")    printList(root)    print("Linked List after operations :")    root = keyToEnd(root, key)         printList(root)     # This code is contributed by rutvik_56
// C# code to remove key// element to end of linked listusing System; // Node classpublic class Node {    public int data;    public Node next;     public Node(int data)    {        this.data = data;        this.next = null;    }} class GFG {     static Node root;     // Function to remove key to end    public static Node keyToEnd(Node head, int key)    {         // Node to keep pointing to tail        Node tail = head;         if (head == null) {            return null;        }         while (tail.next != null) {            tail = tail.next;        }         // Node to point to last of linked list        Node last = tail;         Node current = head;        Node prev = null;         // Node prev2 to point to        // previous when head.data!=key        Node prev2 = null;         // loop to perform operations        // to remove key to end        while (current != tail) {            if (current.data == key && prev2 == null) {                prev = current;                current = current.next;                head = current;                last.next = prev;                last = last.next;                last.next = null;                prev = null;            }            else {                if (current.data == key && prev2 != null) {                    prev = current;                    current = current.next;                    prev2.next = current;                    last.next = prev;                    last = last.next;                    last.next = null;                }                else if (current != tail) {                    prev2 = current;                    current = current.next;                }            }        }        return head;    }     // Function to display linked list    public static void display(Node root)    {        while (root != null) {            Console.Write(root.data + " ");            root = root.next;        }    }     // Driver Code    public static void Main()    {        root = new Node(5);        root.next = new Node(2);        root.next.next = new Node(2);        root.next.next.next = new Node(7);        root.next.next.next.next = new Node(2);        root.next.next.next.next.next = new Node(2);        root.next.next.next.next.next.next = new Node(2);         int key = 2;        Console.WriteLine("Linked List before operations :");        display(root);        Console.WriteLine("\nLinked List after operations :");        root = keyToEnd(root, key);        display(root);    }} // This code is contributed by PrinciRaj1992
<script>// javascript code to remove key element to end of linked list// Node class    class Node {        constructor(val) {            this.data = val;            this.next = null;        }    }    var root;     // Function to remove key to end    function keyToEnd(head , key) {         // Node to keep pointing to tail        var tail = head;         if (head == null) {            return null;        }         while (tail.next != null) {            tail = tail.next;        }         // Node to point to last of linked list        var last = tail;         var current = head;        var prev = null;         // Node prev2 to point to previous when head.data!=key        var prev2 = null;         // loop to perform operations to remove key to end        while (current != tail) {            if (current.data == key && prev2 == null) {                prev = current;                current = current.next;                head = current;                last.next = prev;                last = last.next;                last.next = null;                prev = null;            } else {                if (current.data == key && prev2 != null) {                    prev = current;                    current = current.next;                    prev2.next = current;                    last.next = prev;                    last = last.next;                    last.next = null;                } else if (current != tail) {                    prev2 = current;                    current = current.next;                }            }        }        return head;    }     // Function to display linked list    function display(root) {        while (root != null) {            document.write(root.data + " ");            root = root.next;        }    }     // Driver Code             root = new Node(5);        root.next = new Node(2);        root.next.next = new Node(2);        root.next.next.next = new Node(7);        root.next.next.next.next = new Node(2);        root.next.next.next.next.next = new Node(2);        root.next.next.next.next.next.next = new Node(2);         var key = 2;        document.write("Linked List before operations :<br/>");        display(root);        document.write("<br/>Linked List after operations :<br/>");        root = keyToEnd(root, key);        display(root); // This code contributed by aashish1995</script>
Output: 
Linked List before operations :
5 2 2 7 2 2 2 
Linked List after operations :
5 7 2 2 2 2 2
Thanks to Ravinder Kumar for suggesting this method.
Efficient Solution 3: is to maintain a separate list of keys. We initialize this list of keys as empty. We traverse the given list. For every key found, we remove it from the original list and insert it into a separate list of keys. We finally link the list of keys at the end of the remaining given list. The time complexity of this solution is also O(n) and it also requires only one traversal of the list.
This article is contributed by MAZHAR IMAM KHAN. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
princiraj1992
andrew1234
29AjayKumar
Rajput-Ji
rutvik_56
umadevi9616
aashish1995
khushboogoyal499
gulshankumarar231
surinderdawra388
Linked List
Searching
Linked List
Searching
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Delete a Linked List node at a given position
Implementing a Linked List in Java using Class
Circular Linked List | Set 1 (Introduction and Applications)
Find Length of a Linked List (Iterative and Recursive)
Merge Sort for Linked Lists
Binary Search
Linear Search
Maximum and minimum of an array using minimum number of comparisons
Find the Missing Number
K'th Smallest/Largest Element in Unsorted Array | Set 1