Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmJavascript Program For Partitioning A Linked List Around A Given Value And...

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

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 :

  1. 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.
  2. 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.
  3. 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 node
function 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 concatenating
function 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

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!

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Commit to GfG’s Three-90 Challenge! Purchase a course, complete 90% in 90 days, and save 90% cost click here to explore.

Last Updated :
22 Jun, 2022
Like Article
Save Article


Previous

<!–

8 Min Read | Java

–>


Next


<!–

8 Min Read | Java

–>

Share your thoughts in the comments

Nango Kalahttps://www.kala.co.za
Experienced Support Engineer with a demonstrated history of working in the information technology and services industry. Skilled in Microsoft Excel, Customer Service, Microsoft Word, Technical Support, and Microsoft Office. Strong information technology professional with a Microsoft Certificate Solutions Expert (Privet Cloud) focused in Information Technology from Broadband Collage Of Technology.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments