Sorted insert for circular linked list

Given a sorted circular linked list, the task is to insert a new node in this circular list so that it remains a sorted circular linked list.



Example 1:


Input:

LinkedList = 1->2->4

(the first and last node is connected,

i.e. 4 --> 1)

data = 2

Output: 1 2 2 4

Example 2:


Input:

LinkedList = 1->4->7->9

(the first and last node is connected,

i.e. 9 --> 1)

data = 5

Output: 1 4 5 7 9


1. There will be 3 cases in this question:


    Case 1: head_ref is NULL

                  In this case, create a node with data x and store its address at head_ref.


    Case 2: data of head node is greater than new node's data

                  In this case as well, new node will become head of list and previous head will be second node.


    Case 3: if none of the prev is true

                  Locate a node whose data is greater than new data and insert new node right before it. In case no such node is found in the list, append new node at the end.



c++ implementation:

Node *sortedInsert(struct Node *head, int data)

{

    struct Node* current = head;

    struct Node* new_Node = new Node(data);

    

    // Case 1 of the above algo

    if (current == NULL)

    {

      head=new_Node;

      return head;

    }

    

    // 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;

        return 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;

        return head;

    }

}

Time Complexity: O(n)  
darkmode