Python Program For Moving All Occurrences Of An Element To End In A Linked List
Last Updated :
01 Feb, 2023
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.
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
")
printList(head)
key = 10
head = moveToEnd(head, key)
print("
After moveToEnd(), the Linked list is
")
printList(head)
# This code is contributed by Arnab Kundu
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.
Space Complexity : O(1)
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.
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
elif (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
Output:
Linked 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) where n is the size of the given list.
Auxiliary Space: O(1) because it is using constant 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. The time complexity of this solution is also O(n) and it also requires only one traversal of the list.
Please refer complete article on Move all occurrences of an element to end in a linked list for more details!
Similar Reads
Python Program For Moving Last Element To Front Of A Given Linked List
Write a function that moves the last element to the front 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 5->1->2->3->4. Algorithm: Traverse the list till the last node. Use two pointers: one t
3 min read
Python Program For Finding The Middle Element Of A Given Linked List
Given a singly linked list, find the middle of the linked list. For example, if the given linked list is 1->2->3->4->5 then the output should be 3. If there are even nodes, then there would be two middle nodes, we need to print the second middle element. For example, if given linked list
4 min read
Python Program For Deleting Last Occurrence Of An Item From Linked List
Using pointers, loop through the whole list and keep track of the node prior to the node containing the last occurrence key using a special pointer. After this just store the next of next of the special pointer, into to next special pointer to remove the required node from the linked list. Python3 #
6 min read
Python Program To Delete Alternate Nodes Of A Linked List
Given a Singly Linked List, starting from the second node delete all alternate nodes of it. For example, if the given linked list is 1->2->3->4->5 then your function should convert it to 1->3->5, and if the given linked list is 1->2->3->4 then convert it to 1->3. Recomm
3 min read
Python Program To Delete N Nodes After M Nodes Of A Linked List
Given a linked list and two integers M and N. Traverse the linked list such that you retain M nodes then delete next N nodes, continue the same till end of the linked list.Difficulty Level: Rookie Examples: Input: M = 2, N = 2 Linked List: 1->2->3->4->5->6->7->8 Output: Linked L
3 min read
Python Program for Deleting a Node in a Linked List
We have discussed Linked List Introduction and Linked List Insertion in previous posts on a singly linked list.Let us formulate the problem statement to understand the deletion process. Given a 'key', delete the first occurrence of this key in the linked list. Iterative Method:To delete a node from
3 min read
Python Program For Removing All Occurrences Of Duplicates From A Sorted Linked List
Given a sorted linked list, delete all nodes that have duplicate numbers (all occurrences), leaving only numbers that appear once in the original list. Examples: Input: 23->28->28->35->49->49->53->53 Output: 23->35 Input: 11->11->11->11->75->75 Output: empty Li
3 min read
Python Program For Deleting A Linked List Node At A Given Position
Given a singly linked list and a position, delete a linked list node at the given position. Example: Input: position = 1, Linked List = 8->2->3->1->7 Output: Linked List = 8->3->1->7 Input: position = 0, Linked List = 8->2->3->1->7 Output: Linked List = 2->3->1
3 min read
Python Program For Deleting A Node In A Doubly Linked List
Pre-requisite: Doubly Link List Set 1| Introduction and Insertion Write a function to delete a given node in a doubly-linked list. Original Doubly Linked List Recommended: Please solve it on "PRACTICE" first, before moving on to the solution. Approach: The deletion of a node in a doubly-linked list
4 min read
Python Program For Searching An Element In A Linked List
Write a function that searches a given key 'x' in a given singly linked list. The function should return true if x is present in linked list and false otherwise. bool search(Node *head, int x) For example, if the key to be searched is 15 and linked list is 14->21->11->30->10, then functi
4 min read