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

Given a linked list and a key in it, the task is to move all occurrences of given key to end of linked list, keeping order of all other elements 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```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

A simple solution is to one by one find all occurrences of given key in linked list. For every found occurrence, insert it at the end. We do it till all occurrences of given key are moved to 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 key if a key is found. Else same as pCrawl.

We start both of the above pointers from head of 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 same, we must have found a key which lies before pCrawl, so we swap data of pCrawl and pKey, and move pKey to 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++

 `// C++ program to move all occurrences of a ` `// given key to end. ` `#include ` ` `  `// A Linked list Node ` `struct` `Node { ` `    ``int` `data; ` `    ``struct` `Node* next; ` `}; ` ` `  `// A urility 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 list ` `void` `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 code ` `int` `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

 `// 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 urility 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 `

## Python

 `# Python program to move all occurrences of a ` `# given key to end. ` ` `  `# Linked List node  ` `class` `Node:  ` `    ``def` `__init__(``self``, data):  ` `        ``self``.data ``=` `data  ` `        ``self``.``next` `=` `None` ` `  `# A urility 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 list ` `def` `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 code ` `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``) ` ` `  `print``(``"Before moveToEnd(), the Linked list is\n"``) ` `printList(head) ` ` `  `key ``=` `10` `head ``=` `moveToEnd(head, key) ` ` `  `print``(``"\nAfter moveToEnd(), the Linked list is\n"``) ` `printList(head) ` ` `  `# This code is contributed by Arnab Kundu `

## C#

 `// 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 urility 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 `

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 list.

Efficient Solution 2 :
1. Traverse the linked list and take a pointer at tail.
2. Now, check for the key and node->data, if they are equal, move the node to last-next, else move

## C++

 `// C++ code to remove key element to end of linked list ` `#include ` `using` `namespace` `std; ` ` `  `// A Linked list Node ` `struct` `Node  ` `{ ` `    ``int` `data; ` `    ``struct` `Node* next; ` `}; ` ` `  `// A urility 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 end ` `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 ` `void` `printList(Node* head)  ` `{ ` `    ``struct` `Node* temp = head; ` `    ``while` `(temp != NULL)  ` `    ``{ ` `        ``printf``(``"%d "``, temp->data); ` `        ``temp = temp->next; ` `    ``} ` `    ``printf``(``"\n"``); ` `} ` ` `  ` `  `// Driver Code ` `int` `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

 `// Java code to remove key element to end of linked list ` `import` `java.util.*; ` ` `  `// Node class ` `class` `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); ` `    ``} ` `} `

## C#

 `// C# code to remove key ` `// element to end of linked list ` `using` `System; ` ` `  `// Node class ` `public` `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 `

Output:

```Linked List before operations :
5 2 2 7 2 2 2
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 given list. For every key found, we remove it from the original list and insert into the separate list of keys. We finally link list of keys at the end of remaining given list. Time complexity of this solution is also O(n) and it also requires only one traversal of 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 contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

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

Article Tags :
Practice Tags :

3

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.