Move all occurrences of an element to end in a linked list
Last Updated :
08 Jul, 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), as we will be using nested loops to find the node with the key and insert it at the end of the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
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 the 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++
// C++ program to move all occurrences of a
// given key to end.
#include <bits/stdc++.h>
// A Linked list Node
struct 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 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 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
# Python3 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 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 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 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
JavaScript
<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>
OutputBefore 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), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
Efficient Solution 2 :
- Traverse the linked list and take a pointer at the tail.
- Now, check for the key and node->data. If they are equal, move the node to last-next, else move ahead.
C++
// C++ code to remove key element to end of linked list
#include<bits/stdc++.h>
using namespace std;
// A Linked list Node
struct 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 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);
}
}
Python3
# Python3 code to remove key element to
# end of linked list
# A Linked list Node
class 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 end
def 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 list
def printList(head):
temp = head
while (temp != None):
print(temp.data, end = ' ')
temp = temp.next
print()
# Driver Code
if __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#
// 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
JavaScript
<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>
OutputLinked List before operations :5 2 2 7 2 2 2
Linked List after operations :5 7 2 2 2 2 2
Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
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.
Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
Auxiliary Space: O(1), as we are not using any extra space.
Similar Reads
Javascript Program For Moving 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 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 min read
Delete all occurrences of a given key in a linked list
Given a singly linked list, the task is to delete all occurrences of a given key in it.Examples:Input: head: 2 -> 2 -> 1 -> 8 -> 2 -> NULL, key = 2Output: 1 -> 8 -> NULL Explanation: All occurrences of the given key = 2, is deleted from the Linked ListInput: head: 1 -> 1 -
8 min read
Move first element to end of a given Linked List
Write a C function that moves first element to end in a given Singly Linked List. For example, if the given Linked List is 1->2->3->4->5, then the function should change the list to 2->3->4->5->1. Algorithm: Traverse the list till last node. Use two pointers: one to store the
13 min read
Modify a Linked List to contain last occurrences of every duplicate element
Given an unsorted Singly Linked List consisting of N nodes that may contain duplicate elements, the task is to remove all but the last occurrence of duplicate elements from the Linked List. Examples: Input: 1 -> 2 -> 7 -> 3 -> 2 -> 5 -> 1Output: 7 -> 3 -> 2 -> 5 -> 1Exp
10 min read
Move the Kth Element in a Doubly Linked List to the End
Given a doubly linked list and an integer K, you need to move the Kth element to the end of the list while maintaining the order of the other elements. Examples: Input: DLL: 2 <-> 6 <-> 3 <-> 8 <-> 11 <-> 23 <-> 7 -> NULL, K = 1Output: 6 <-> 3 <-> 8
13 min read
Delete all occurrences of a given key in a doubly linked list
Given a doubly linked list and a key x. The problem is to delete all occurrences of the given key x from the doubly linked list. Examples: Algorithm: delAllOccurOfGivenKey(head_ref, x) if head_ref == NULL return Initialize current = head_ref Declare next while current != NULL if current->data ==
14 min read
Move last element to front of a given Linked List
Given a singly linked list. The task is to move the last node to the front in a given List.Examples:Input: 2->5->6->2->1Output: 1->2->5->6->2Explanation : Node 1 moved to front. Input: 1->2->3->4->5Output: 5->1->2->3->4Explanation : Node 5 moved to fro
8 min read
Remove all occurrences of one Linked list in another Linked list
Given two linked lists head1 and head2, the task is to remove all occurrences of head2 in head1 and return the head1. Examples: Input: head1 = 2 -> 3 -> 4 -> 5 -> 3 -> 4, head2 = 3 -> 4Output: 2 -> 5Explanation: After removing all occurrences of 3 -> 4 in head1 output is 2 -
9 min read
Move last element to front of a given Linked List | Set 2
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 -
9 min read
Rearrange a linked list in to alternate first and last element
Given a singly linked list L0 -> L1 -> ⦠-> Ln-1 -> Ln. Rearrange the nodes in the list so that the newly formed list is : L0 -> Ln -> L1 -> Ln-1 -> L2 -> Ln-2 ... You are required to do this in place without altering the nodes' values. Examples: Input: 1 -> 2 -> 3 -
6 min read