Write a C function to insert a new value in a sorted Circular Linked List (CLL). For example, if the input CLL is following:

Sorted insert for circular linked list

After insertion of 7, the above CLL should be changed to following

Sorted insert for circular linked list

Algorithm:
Allocate memory for the newly inserted node and put data in the newly allocated node. Let the pointer to the new node be new_node. After memory allocation, following are the three cases that need to be handled.

1) Linked List is empty:  
    a)  since new_node is the only node in CLL, make a self loop.      
          new_node->next = new_node;  
    b) change the head pointer to point to new node.
          *head_ref = new_node;
2) New node is to be inserted just before the head node:    
  (a) Find out the last node using a loop.
         while(current->next != *head_ref)
            current = current->next;
  (b) Change the next of last node. 
         current->next = new_node;
  (c) Change next of new node to point to head.
         new_node->next = *head_ref;
  (d) change the head pointer to point to new node.
         *head_ref = new_node;
3) New node is to be  inserted somewhere after the head: 
   (a) Locate the node after which new node is to be inserted.
         while ( current->next!= *head_ref && 
             current->next->data < new_node->data)
         {   current = current->next;   }
   (b) Make next of new_node as next of the located pointer
         new_node->next = current->next;
   (c) Change the next of the located pointer
         current->next = new_node;
[ad type=”banner”]

Java Programming:

// Java program for sorted insert in circular linked list

class Node
{
int data;
Node next;

Node(int d)
{
data = d;
next = null;
}
}

class LinkedList
{
Node head;

// Constructor
LinkedList() { head = null; }

/* function to insert a new_node in a list in sorted way.
Note that this function expects a pointer to head node
as this can modify the head of the input linked list */
void sortedInsert(Node new_node)
{
Node current = head;

// Case 1 of the above algo
if (current == null)
{
new_node.next = new_node;
head = new_node;

}

// Case 2 of the above algo
else if (current.data >= new_node.data)
{

/* If value is smaller than head's value then
we need to change next of last node */
while (current.next != head)
current = current.next;

current.next = new_node;
new_node.next = head;
head = new_node;
}

// Case 3 of the above algo
else
{

/* Locate the node before the point of insertion */
while (current.next != head &&
current.next.data < new_node.data)
current = current.next;

new_node.next = current.next;
current.next = new_node;
}
}

// Utility method to print a linked list
void printList()
{
if (head != null)
{
Node temp = head;
do
{
System.out.print(temp.data + " ");
temp = temp.next;
} while (temp != head);
}
}

// Driver code to test above
public static void main(String[] args)
{
LinkedList list = new LinkedList();

// Creating the linkedlist
int arr[] = new int[] {12, 56, 2, 11, 1, 90};

/* start with empty linked list */
Node temp = null;

/* Create linked list from the array arr[].
Created linked list will be 1->2->11->12->56->90*/
for (int i = 0; i < 6; i++)
{
temp = new Node(arr[i]);
list.sortedInsert(temp);
}

list.printList();
}
}

Output:

1 2 11 12 56 90

Time Complexity: O(n) where n is the number of nodes in the given linked list.

[ad type=”banner”]

Case 2 of the above algorithm/code can be optimized. Please see this comment from Pavan. To implement the suggested change we need to modify the case 2 to following.

// Case 2 of the above algo
else if (current->data >= new_node->data)
{
// swap the data part of head node and new node
// assuming that we have a function swap(int *, int *)
swap(&(current->data), &(new_node->data));

new_node->next = (*head_ref)->next;
(*head_ref)->next = new_node;
}
[ad type=”banner”]