C++ Program For Partitioning A Linked List Around A Given Value And Keeping The Original Order
Last Updated :
22 Jun, 2022
Given a linked list and a value x, partition it such that all nodes less than x come first, then all nodes with a value equal to x, and finally nodes with a value greater than or equal to x. The original relative order of the nodes in each of the three partitions should be preserved. The partition must work in place.
Examples:
Input: 1->4->3->2->5->2->3,
x = 3
Output: 1->2->2->3->3->4->5
Input: 1->4->2->10
x = 3
Output: 1->2->4->10
Input: 10->4->20->10->3
x = 3
Output: 3->10->4->20->10
To solve this problem we can use partition method of Quick Sort but this would not preserve the original relative order of the nodes in each of the two partitions.
Below is the algorithm to solve this problem :
- Initialize first and last nodes of below three linked lists as NULL.
- Linked list of values smaller than x.
- Linked list of values equal to x.
- Linked list of values greater than x.
- Now iterate through the original linked list. If a node's value is less than x then append it at the end of the smaller list. If the value is equal to x, then at the end of the equal list. And if a value is greater, then at the end of the greater list.
- Now concatenate three lists.
Below is the implementation of the above idea.
C++
// C++ program to partition a linked list
// around a given value.
#include<bits/stdc++.h>
using namespace std;
// Link list Node
struct Node
{
int data;
struct Node* next;
};
// A utility function to create
// a new node
Node *newNode(int data)
{
struct Node* new_node = new Node;
new_node->data = data;
new_node->next = NULL;
return new_node;
}
// Function to make two separate lists
// and return head after concatenating
struct Node *partition(struct Node *head,
int x)
{
/* Let us initialize first and last
nodes of three linked lists
1) Linked list of values smaller
than x.
2) Linked list of values equal
to x.
3) Linked list of values greater
than x.*/
struct Node *smallerHead = NULL,
*smallerLast = NULL;
struct Node *greaterLast = NULL,
*greaterHead = NULL;
struct Node *equalHead = NULL,
*equalLast = NULL;
// Now iterate original list and
// connect nodes of appropriate
// linked lists.
while (head != NULL)
{
// If current node is equal to x,
// append it to the list of x values
if (head->data == x)
{
if (equalHead == NULL)
equalHead = equalLast = head;
else
{
equalLast->next = head;
equalLast = equalLast->next;
}
}
// If current node is less than X,
// append it to the list of smaller
// values
else if (head->data < x)
{
if (smallerHead == NULL)
smallerLast = smallerHead = head;
else
{
smallerLast->next = head;
smallerLast = head;
}
}
// Append to the list of greater values
else
{
if (greaterHead == NULL)
greaterLast = greaterHead = head;
else
{
greaterLast->next = head;
greaterLast = head;
}
}
head = head->next;
}
// Fix end of greater linked list to
// NULL if this list has some nodes
if (greaterLast != NULL)
greaterLast->next = NULL;
// Connect three lists
// If smaller list is empty
if (smallerHead == NULL)
{
if (equalHead == NULL)
return greaterHead;
equalLast->next = greaterHead;
return equalHead;
}
// If smaller list is not empty
// and equal list is empty
if (equalHead == NULL)
{
smallerLast->next = greaterHead;
return smallerHead;
}
// If both smaller and equal list
// are non-empty
smallerLast->next = equalHead;
equalLast->next = greaterHead;
return smallerHead;
}
// Function to print linked list
void printList(struct Node *head)
{
struct Node *temp = head;
while (temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
}
// Driver code
int main()
{
// Start with the empty list
struct Node* head = newNode(10);
head->next = newNode(4);
head->next->next = newNode(5);
head->next->next->next = newNode(30);
head->next->next->next->next =
newNode(2);
head->next->next->next->next->next =
newNode(50);
int x = 3;
head = partition(head, x);
printList(head);
return 0;
}
Output:
2 10 4 5 30 50
Time Complexity: O(n) where n is the size of the given linked list.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Please refer complete article on Partitioning a linked list around a given value and keeping the original order for more details!
Similar Reads
C++ Program For Pointing To Next Higher Value Node In A Linked List With An Arbitrary Pointer Given singly linked list with every node having an additional "arbitrary" pointer that currently points to NULL. Need to make the "arbitrary" pointer point to the next higher value node. We strongly recommend to minimize your browser and try this yourself first A Simple Solution is to traverse all n
5 min read
C++ Program For Inserting Node In The Middle Of The Linked List Given a linked list containing n nodes. The problem is to insert a new node with data x at the middle of the list. If n is even, then insert the new node after the (n/2)th node, else insert the new node after the (n+1)/2th node. Examples: Input : list: 1->2->4->5 x = 3 Output : 1->2->
5 min read
C++ Program For Inserting A Node In A Linked List Inserting a node into a linked list can be done in several ways, depending on where we want to insert the new node. Here, we'll cover four common scenarios: inserting at the front of the list, after a given node, at a specific position, and at the end of the listTable of ContentInsert a Node at the
9 min read
C++ Program For Rearranging A Given Linked List In-Place Given a singly linked list L0 -> L1 -> ⦠-> Ln-1 -> Ln. Rearrange the nodes in the list so that the new 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 -
7 min read
C++ Program For Arranging Single Linked List In Alternate Odd and Even Nodes Order Given a singly linked list, rearrange the list so that even and odd nodes are alternate in the list.There are two possible forms of this rearrangement. If the first data is odd, then the second node must be even. The third node must be odd and so on. Notice that another arrangement is possible where
8 min read
C++ Program To Merge A Linked List Into Another Linked List At Alternate Positions Given two linked lists, insert nodes of second list into first list at alternate positions of first list. For example, if first list is 5->7->17->13->11 and second is 12->10->2->4->6, the first list should become 5->12->7->10->17->2->13->4->11->6 an
3 min read