Skip to content
Related Articles
Get the best out of our app
GeeksforGeeks App
Open App

Related Articles

Java Program For Sorting A Linked List Of 0s, 1s And 2s By Changing Links

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given a linked list of 0s, 1s and 2s, sort it.

Input: 2->1->2->1->1->2->0->1->0
Output: 0->0->1->1->1->1->2->2->2
The sorted Array is 0, 0, 1, 1, 1, 1, 2, 2, 2.

Input: 2->1->0
Output: 0->1->2
The sorted Array is 0, 1, 2

Method 1: There is a solution discussed in below post that works by changing data of nodes. 
Sort a linked list of 0s, 1s and 2s
The above solution does not work when these values have associated data with them. 
For example, these three represent three colors and different types of objects associated with the colors and sort the objects (connected with a linked list) based on colors.

Method 2: In this post, a new solution is discussed that works by changing links.
Approach: Iterate through the linked list. Maintain 3 pointers named zero, one, and two to point to current ending nodes of linked lists containing 0, 1, and 2 respectively. For every traversed node, we attach it to the end of its corresponding list. Finally, we link all three lists. To avoid many null checks, we use three dummy pointers zeroD, oneD, and twoD that work as dummy headers of three lists.


// Java Program to sort a linked list 
// 0s, 1s or 2s by changing links 
public class Sort012 
    // Sort a linked list of 0s, 1s 
    // and 2s by changing pointers.
    public static Node sortList(Node head)
        if(head==null ||
            return head;
        // Create three dummy nodes to point to 
        // beginning of three linked lists. These 
        // dummy nodes are created to avoid many 
        // null checks. 
        Node zeroD = new Node(0); 
        Node oneD = new Node(0); 
        Node twoD = new Node(0); 
        // Initialize current pointers for three 
        // lists and whole list. 
        Node zero = zeroD, one = oneD, two = twoD; 
        // Traverse list 
        Node curr = head; 
        while (curr!=null
            if ( == 0
       = curr; 
                zero =; 
                curr =; 
            else if ( == 1
       = curr; 
                one =; 
                curr =; 
       = curr; 
                two =; 
                curr =; 
        // Attach three lists = (!=null) ? 
                    ( : (; =; = null;
        // Updated head 
        head =;
        return head;
    // Function to create and return a node 
    public static Node newNode(int data) 
        // Allocating space 
        Node newNode = new Node(data); = null
        return newNode;
    // Function to print linked list 
    public static void printList(Node node) 
        while (node != null
            System.out.print(" ");
            node =; 
    Driver code
    public static void main(String args[]) 
        Node head = new Node(1); = new Node(2); = new Node(0); = new Node(1);
        "Linked List Before Sorting");
        head = sortList(head);  
        "Linked List After Sorting");
class Node
    int data;
    Node next;
    Node(int data)
//This code is contributed by Gaurav Tiwari

Output : 

Linked List Before Sorting
1  2  0  1  
Linked List After Sorting
0  1  1  2  

Complexity Analysis: 

  • Time Complexity: O(n) where n is a number of nodes in linked list. 
    Only one traversal of the linked list is needed.
  • Auxiliary Space: O(1). 
    As no extra space is required.

Please refer complete article on Sort a linked list of 0s, 1s and 2s by changing links for more details!

My Personal Notes arrow_drop_up
Last Updated : 11 Jan, 2022
Like Article
Save Article
Similar Reads
Related Tutorials