Javascript Program For Partitioning A Linked List Around A Given Value And Keeping The Original Order - GeeksforGeeks

11 Jan, 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.
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.
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.
Javascript
<script>// Javascript program to partition a // linked list around a given value. // Link list Node class Node {    constructor()     {        this.data = 0;        this.next = null;    }}       // A utility function to create // a new nodefunction newNode(data) {    var 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 concatenatingfunction partition(head, 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. */    var smallerHead = null,         smallerLast = null;    var greaterLast = null,         greaterHead = null;    var 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 function printList(head) {    var temp = head;    while (temp != null)     {        document.write(temp.data + " ");        temp = temp.next;    }}  // Driver code// Start with the empty list var 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);  var x = 3;head = partition(head, x);printList(head);// This code is contributed by aashish1995 </script>
Output:  
2 10 4 5 30 50
Please refer complete article on Partitioning a linked list around a given value and keeping the original order for more details!
arorakashish0911
Linked List
Linked List
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Circular Linked List | Set 2 (Traversal)
Swap nodes in a linked list without swapping data
Program to implement Singly Linked List in C++ using class
Circular Singly Linked List | Insertion
Given a linked list which is sorted, how will you insert in sorted way
Delete a node in a Doubly Linked List
Real-time application of Data Structures
Linked List Implementation in C#
Insert a node at a specific position in a linked list
Move last element to front of a given Linked List