Circular Queue | Set 2 (Circular Linked List Implementation) - GeeksforGeeks

30 Sep, 2020
Prerequisite – Circular Singly Linked List
We have discussed basics and how to implement circular queue using array in set 1.Circular Queue | Set 1 (Introduction and Array Implementation)
In this post another method of circular queue implementation is discussed, using Circular Singly Linked List.
Operations on Circular Queue:
Front:Get the front item from queue.
Rear: Get the last item from queue.
enQueue(value) This function is used to insert an element into the circular queue. In a circular queue, the new element is always inserted at Rear position.Steps:Create a new node dynamically and insert value into it.Check if front==NULL, if it is true then front = rear = (newly created node)If it is false then rear=(newly created node) and rear node always contains the address of the front node.
Steps:Create a new node dynamically and insert value into it.Check if front==NULL, if it is true then front = rear = (newly created node)If it is false then rear=(newly created node) and rear node always contains the address of the front node.
Create a new node dynamically and insert value into it.
Check if front==NULL, if it is true then front = rear = (newly created node)
If it is false then rear=(newly created node) and rear node always contains the address of the front node.
deQueue() This function is used to delete an element from the circular queue. In a queue, the element is always deleted from front position.Steps:Check whether queue is empty or not means front == NULL.If it is empty then display Queue is empty. If queue is not empty then step 3Check if (front==rear) if it is true then set front = rear = NULL else move the front forward in queue, update address of front in rear node and return the element.Recommended: Please try your approach on {IDE} first, before moving on to the solution.Below is the implementation of above approach:C++JavaPython3C#C++// C++ program for insertion and// deletion in Circular Queue#include <bits/stdc++.h>using namespace std;  // Structure of a Nodestruct Node {    int data;    struct Node* link;};  struct Queue {    struct Node *front, *rear;};  // Function to create Circular queuevoid enQueue(Queue* q, int value){    struct Node* temp = new Node;    temp->data = value;    if (q->front == NULL)        q->front = temp;    else        q->rear->link = temp;      q->rear = temp;    q->rear->link = q->front;}  // Function to delete element from Circular Queueint deQueue(Queue* q){    if (q->front == NULL) {        printf("Queue is empty");        return INT_MIN;    }      // If this is the last node to be deleted    int value; // Value to be dequeued    if (q->front == q->rear) {        value = q->front->data;        free(q->front);        q->front = NULL;        q->rear = NULL;    }    else // There are more than one nodes    {        struct Node* temp = q->front;        value = temp->data;        q->front = q->front->link;        q->rear->link = q->front;        free(temp);    }      return value;}  // Function displaying the elements of Circular Queuevoid displayQueue(struct Queue* q){    struct Node* temp = q->front;    printf("\nElements in Circular Queue are: ");    while (temp->link != q->front) {        printf("%d ", temp->data);        temp = temp->link;    }    printf("%d", temp->data);}  /* Driver of the program */int main(){    // Create a queue and initialize front and rear    Queue* q = new Queue;    q->front = q->rear = NULL;      // Inserting elements in Circular Queue    enQueue(q, 14);    enQueue(q, 22);    enQueue(q, 6);      // Display elements present in Circular Queue    displayQueue(q);      // Deleting elements from Circular Queue    printf("\nDeleted value = %d", deQueue(q));    printf("\nDeleted value = %d", deQueue(q));      // Remaining elements in Circular Queue    displayQueue(q);      enQueue(q, 9);    enQueue(q, 20);    displayQueue(q);      return 0;}Java// Java program for insertion and// deletion in Circular Queueimport java.util.*;  class Solution {      // Structure of a Node    static class Node {        int data;        Node link;    }      static class Queue {        Node front, rear;    }      // Function to create Circular queue    static void enQueue(Queue q, int value)    {        Node temp = new Node();        temp.data = value;        if (q.front == null)            q.front = temp;        else            q.rear.link = temp;          q.rear = temp;        q.rear.link = q.front;    }      // Function to delete element from Circular Queue    static int deQueue(Queue q)    {        if (q.front == null) {            System.out.printf("Queue is empty");            return Integer.MIN_VALUE;        }          // If this is the last node to be deleted        int value; // Value to be dequeued        if (q.front == q.rear) {            value = q.front.data;            q.front = null;            q.rear = null;        }        else // There are more than one nodes        {            Node temp = q.front;            value = temp.data;            q.front = q.front.link;            q.rear.link = q.front;        }          return value;    }      // Function displaying the elements of Circular Queue    static void displayQueue(Queue q)    {        Node temp = q.front;        System.out.printf("\nElements in Circular Queue are: ");        while (temp.link != q.front) {            System.out.printf("%d ", temp.data);            temp = temp.link;        }        System.out.printf("%d", temp.data);    }      /* Driver of the program */    public static void main(String args[])    {        // Create a queue and initialize front and rear        Queue q = new Queue();        q.front = q.rear = null;          // Inserting elements in Circular Queue        enQueue(q, 14);        enQueue(q, 22);        enQueue(q, 6);          // Display elements present in Circular Queue        displayQueue(q);          // Deleting elements from Circular Queue        System.out.printf("\nDeleted value = %d", deQueue(q));        System.out.printf("\nDeleted value = %d", deQueue(q));          // Remaining elements in Circular Queue        displayQueue(q);          enQueue(q, 9);        enQueue(q, 20);        displayQueue(q);    }}  // This code is contributed// by Arnab KunduPython3# Python3 program for insertion and # deletion in Circular Queue   # Structure of a Node class Node:    def __init__(self):        self.data = None        self.link = None  class Queue:    def __init__(self):        front = None        rear = None  # Function to create Circular queue def enQueue(q, value):    temp = Node()     temp.data = value     if (q.front == None):         q.front = temp     else:        q.rear.link = temp       q.rear = temp     q.rear.link = q.front  # Function to delete element from # Circular Queue def deQueue(q):    if (q.front == None):        print("Queue is empty")         return -999999999999      # If this is the last node to be deleted     value = None # Value to be dequeued     if (q.front == q.rear):        value = q.front.data        q.front = None        q.rear = None    else: # There are more than one nodes         temp = q.front         value = temp.data         q.front = q.front.link         q.rear.link = q.front      return value   # Function displaying the elements # of Circular Queue def displayQueue(q):    temp = q.front     print("Elements in Circular Queue are: ",                                    end = " ")     while (temp.link != q.front):        print(temp.data, end = " ")         temp = temp.link    print(temp.data)  # Driver Codeif __name__ == '__main__':      # Create a queue and initialize    # front and rear     q = Queue()     q.front = q.rear = None      # Inserting elements in Circular Queue     enQueue(q, 14)     enQueue(q, 22)     enQueue(q, 6)       # Display elements present in     # Circular Queue     displayQueue(q)       # Deleting elements from Circular Queue     print("Deleted value = ", deQueue(q))     print("Deleted value = ", deQueue(q))       # Remaining elements in Circular Queue     displayQueue(q)       enQueue(q, 9)     enQueue(q, 20)     displayQueue(q)  # This code is contributed by PranchalKC#// C# program for insertion and// deletion in Circular Queueusing System;using System.Collections.Generic;  public class GFG {      // Structure of a Node    public class Node {        public int data;        public Node link;    }      public class LinkedList {        public Node front, rear;    }      // Function to create Circular queue    public static void enQueue(LinkedList q,                               int value)    {        Node temp = new Node();        temp.data = value;        if (q.front == null) {            q.front = temp;        }        else {            q.rear.link = temp;        }          q.rear = temp;        q.rear.link = q.front;    }      // Function to delete element from    // Circular Queue    public static int deQueue(LinkedList q)    {        if (q.front == null) {            Console.Write("Queue is empty");            return int.MinValue;        }          // If this is the last node to be deleted        int value; // Value to be dequeued        if (q.front == q.rear) {            value = q.front.data;            q.front = null;            q.rear = null;        }        else // There are more than one nodes        {            Node temp = q.front;            value = temp.data;            q.front = q.front.link;            q.rear.link = q.front;        }          return value;    }      // Function displaying the elements    // of Circular Queue    public static void displayQueue(LinkedList q)    {        Node temp = q.front;        Console.Write("\nElements in Circular Queue are: ");        while (temp.link != q.front) {            Console.Write("{0:D} ", temp.data);            temp = temp.link;        }        Console.Write("{0:D}", temp.data);    }      // Driver Code    public static void Main(string[] args)    {        // Create a queue and initialize        // front and rear        LinkedList q = new LinkedList();        q.front = q.rear = null;          // Inserting elements in Circular Queue        enQueue(q, 14);        enQueue(q, 22);        enQueue(q, 6);          // Display elements present in        // Circular Queue        displayQueue(q);          // Deleting elements from Circular Queue        Console.Write("\nDeleted value = {0:D}",                      deQueue(q));        Console.Write("\nDeleted value = {0:D}",                      deQueue(q));          // Remaining elements in Circular Queue        displayQueue(q);          enQueue(q, 9);        enQueue(q, 20);        displayQueue(q);    }}  // This code is contributed by Shrikant13Output:Elements in Circular Queue are: 14 22 6
Deleted value = 14
Deleted value = 22
Elements in Circular Queue are: 6
Elements in Circular Queue are: 6 9 20
Time Complexity: Time complexity of enQueue(), deQueue() operation is O(1) as there is no loop in any of the operation.Note: In case of linked list implementation, a queue can be easily implemented without being circular. However, in the case of array implementation, we need a circular queue to save space.This article is contributed by Akash Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.My Personal Notes
arrow_drop_upSave
Steps:Check whether queue is empty or not means front == NULL.If it is empty then display Queue is empty. If queue is not empty then step 3Check if (front==rear) if it is true then set front = rear = NULL else move the front forward in queue, update address of front in rear node and return the element.
Check whether queue is empty or not means front == NULL.
If it is empty then display Queue is empty. If queue is not empty then step 3
Check if (front==rear) if it is true then set front = rear = NULL else move the front forward in queue, update address of front in rear node and return the element.
Below is the implementation of above approach:
C++
Java
Python3
C#
// C++ program for insertion and// deletion in Circular Queue#include <bits/stdc++.h>using namespace std;  // Structure of a Nodestruct Node {    int data;    struct Node* link;};  struct Queue {    struct Node *front, *rear;};  // Function to create Circular queuevoid enQueue(Queue* q, int value){    struct Node* temp = new Node;    temp->data = value;    if (q->front == NULL)        q->front = temp;    else        q->rear->link = temp;      q->rear = temp;    q->rear->link = q->front;}  // Function to delete element from Circular Queueint deQueue(Queue* q){    if (q->front == NULL) {        printf("Queue is empty");        return INT_MIN;    }      // If this is the last node to be deleted    int value; // Value to be dequeued    if (q->front == q->rear) {        value = q->front->data;        free(q->front);        q->front = NULL;        q->rear = NULL;    }    else // There are more than one nodes    {        struct Node* temp = q->front;        value = temp->data;        q->front = q->front->link;        q->rear->link = q->front;        free(temp);    }      return value;}  // Function displaying the elements of Circular Queuevoid displayQueue(struct Queue* q){    struct Node* temp = q->front;    printf("\nElements in Circular Queue are: ");    while (temp->link != q->front) {        printf("%d ", temp->data);        temp = temp->link;    }    printf("%d", temp->data);}  /* Driver of the program */int main(){    // Create a queue and initialize front and rear    Queue* q = new Queue;    q->front = q->rear = NULL;      // Inserting elements in Circular Queue    enQueue(q, 14);    enQueue(q, 22);    enQueue(q, 6);      // Display elements present in Circular Queue    displayQueue(q);      // Deleting elements from Circular Queue    printf("\nDeleted value = %d", deQueue(q));    printf("\nDeleted value = %d", deQueue(q));      // Remaining elements in Circular Queue    displayQueue(q);      enQueue(q, 9);    enQueue(q, 20);    displayQueue(q);      return 0;}
// Java program for insertion and// deletion in Circular Queueimport java.util.*;  class Solution {      // Structure of a Node    static class Node {        int data;        Node link;    }      static class Queue {        Node front, rear;    }      // Function to create Circular queue    static void enQueue(Queue q, int value)    {        Node temp = new Node();        temp.data = value;        if (q.front == null)            q.front = temp;        else            q.rear.link = temp;          q.rear = temp;        q.rear.link = q.front;    }      // Function to delete element from Circular Queue    static int deQueue(Queue q)    {        if (q.front == null) {            System.out.printf("Queue is empty");            return Integer.MIN_VALUE;        }          // If this is the last node to be deleted        int value; // Value to be dequeued        if (q.front == q.rear) {            value = q.front.data;            q.front = null;            q.rear = null;        }        else // There are more than one nodes        {            Node temp = q.front;            value = temp.data;            q.front = q.front.link;            q.rear.link = q.front;        }          return value;    }      // Function displaying the elements of Circular Queue    static void displayQueue(Queue q)    {        Node temp = q.front;        System.out.printf("\nElements in Circular Queue are: ");        while (temp.link != q.front) {            System.out.printf("%d ", temp.data);            temp = temp.link;        }        System.out.printf("%d", temp.data);    }      /* Driver of the program */    public static void main(String args[])    {        // Create a queue and initialize front and rear        Queue q = new Queue();        q.front = q.rear = null;          // Inserting elements in Circular Queue        enQueue(q, 14);        enQueue(q, 22);        enQueue(q, 6);          // Display elements present in Circular Queue        displayQueue(q);          // Deleting elements from Circular Queue        System.out.printf("\nDeleted value = %d", deQueue(q));        System.out.printf("\nDeleted value = %d", deQueue(q));          // Remaining elements in Circular Queue        displayQueue(q);          enQueue(q, 9);        enQueue(q, 20);        displayQueue(q);    }}  // This code is contributed// by Arnab Kundu
# Python3 program for insertion and # deletion in Circular Queue   # Structure of a Node class Node:    def __init__(self):        self.data = None        self.link = None  class Queue:    def __init__(self):        front = None        rear = None  # Function to create Circular queue def enQueue(q, value):    temp = Node()     temp.data = value     if (q.front == None):         q.front = temp     else:        q.rear.link = temp       q.rear = temp     q.rear.link = q.front  # Function to delete element from # Circular Queue def deQueue(q):    if (q.front == None):        print("Queue is empty")         return -999999999999      # If this is the last node to be deleted     value = None # Value to be dequeued     if (q.front == q.rear):        value = q.front.data        q.front = None        q.rear = None    else: # There are more than one nodes         temp = q.front         value = temp.data         q.front = q.front.link         q.rear.link = q.front      return value   # Function displaying the elements # of Circular Queue def displayQueue(q):    temp = q.front     print("Elements in Circular Queue are: ",                                    end = " ")     while (temp.link != q.front):        print(temp.data, end = " ")         temp = temp.link    print(temp.data)  # Driver Codeif __name__ == '__main__':      # Create a queue and initialize    # front and rear     q = Queue()     q.front = q.rear = None      # Inserting elements in Circular Queue     enQueue(q, 14)     enQueue(q, 22)     enQueue(q, 6)       # Display elements present in     # Circular Queue     displayQueue(q)       # Deleting elements from Circular Queue     print("Deleted value = ", deQueue(q))     print("Deleted value = ", deQueue(q))       # Remaining elements in Circular Queue     displayQueue(q)       enQueue(q, 9)     enQueue(q, 20)     displayQueue(q)  # This code is contributed by PranchalK
// C# program for insertion and// deletion in Circular Queueusing System;using System.Collections.Generic;  public class GFG {      // Structure of a Node    public class Node {        public int data;        public Node link;    }      public class LinkedList {        public Node front, rear;    }      // Function to create Circular queue    public static void enQueue(LinkedList q,                               int value)    {        Node temp = new Node();        temp.data = value;        if (q.front == null) {            q.front = temp;        }        else {            q.rear.link = temp;        }          q.rear = temp;        q.rear.link = q.front;    }      // Function to delete element from    // Circular Queue    public static int deQueue(LinkedList q)    {        if (q.front == null) {            Console.Write("Queue is empty");            return int.MinValue;        }          // If this is the last node to be deleted        int value; // Value to be dequeued        if (q.front == q.rear) {            value = q.front.data;            q.front = null;            q.rear = null;        }        else // There are more than one nodes        {            Node temp = q.front;            value = temp.data;            q.front = q.front.link;            q.rear.link = q.front;        }          return value;    }      // Function displaying the elements    // of Circular Queue    public static void displayQueue(LinkedList q)    {        Node temp = q.front;        Console.Write("\nElements in Circular Queue are: ");        while (temp.link != q.front) {            Console.Write("{0:D} ", temp.data);            temp = temp.link;        }        Console.Write("{0:D}", temp.data);    }      // Driver Code    public static void Main(string[] args)    {        // Create a queue and initialize        // front and rear        LinkedList q = new LinkedList();        q.front = q.rear = null;          // Inserting elements in Circular Queue        enQueue(q, 14);        enQueue(q, 22);        enQueue(q, 6);          // Display elements present in        // Circular Queue        displayQueue(q);          // Deleting elements from Circular Queue        Console.Write("\nDeleted value = {0:D}",                      deQueue(q));        Console.Write("\nDeleted value = {0:D}",                      deQueue(q));          // Remaining elements in Circular Queue        displayQueue(q);          enQueue(q, 9);        enQueue(q, 20);        displayQueue(q);    }}  // This code is contributed by Shrikant13
Elements in Circular Queue are: 14 22 6
Deleted value = 14
Deleted value = 22
Elements in Circular Queue are: 6
Elements in Circular Queue are: 6 9 20

Time Complexity: Time complexity of enQueue(), deQueue() operation is O(1) as there is no loop in any of the operation.
Note: In case of linked list implementation, a queue can be easily implemented without being circular. However, in the case of array implementation, we need a circular queue to save space.
This article is contributed by Akash Gupta. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
andrew1234
shrikanth13
soumil
PranchalKatiyar
itsthekaybee
circular linked list
circular-array
Linked List
Queue
Linked List
Queue
circular linked list
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Stack Data Structure (Introduction and Program)
Linked List | Set 3 (Deleting a node)
LinkedList in Java
Breadth First Search or BFS for a Graph
Level Order Binary Tree Traversal
Queue in Python
Queue Interface In Java
Queue | Set 1 (Introduction and Array Implementation)