Find minimum and maximum elements in singly Circular Linked List

Last Updated : 21 Mar, 2023

Given a singly circular linked list of nodes. The task is to find the smallest and largest elements in the circular linked list.

Examples:

```Input : List = 99->11->22->33->44->55->66
Output : Minimum = 11, Maximum = 99

Input : List = 12->11->9->33->125->6->99
Output : Minimum = 6, Maximum = 125 ```

The idea is to traverse the circular linked list while the last node is not reached and initialize the max and min variables to INT_MIN and INT_MAX respectively. After that, check the condition that if the max value is less than the head value, then the head value is assigned to the max or if the min value is greater than the head value, then the head value is assigned to the min, otherwise the head point to the next node. Continue this process until the last node.

Algorithm:

Step 1: Create a function named “printMinMax” that takes the head node of a circular linked list as an input parameter.
Step 2: Create two integer variables min and max and initialize them to Integer.MAX_VALUE and Integer.MIN_VALUE, respectively.
Step 3: Define a pointer “current” and initialize it with the head node.
Step 4: Start a while loop till current.next is not equal to null.
a. In each iteration of the while loop, compare the data of the current node with the values of min and max. If the data is lesser than the                       value of min, assign the data to the min variable. If the data is greater than the value of max, assign the data to the max variable.
b. Update the current pointer to the next node.
Step 5: Now after the while loop,  print the values of min and max statement.
Step 6: Create a function named “insertNode” which takes a head node of a circular linked list and a data value to be inserted into the linked list an              input parameter.
Step 7: Create a new node with the given data value and check whether the node is created successfully or not.
Step 8: Assign the new node’s next pointer to the node itself if the linked list is empty, and then return the new node as the head node.
Step 9: If the linked list is not empty, traverse the linked list until the last node using a while loop.
Step 10: Give the head node the new node’s next pointer and then give it back.
Step 11: Create a function named “displayList” which take the head node of a circular linked list and prints the values of all the nodes in the linked                  list as an input parameter.
Step 12: Use a do-while loop to iteratively navigate the linked list until you reach the head node once more after initializing a pointer with the head                node.
Step 13: Print the value of the current node using the System on each iteration of the do-while loop. out. move the current pointer to the following                node and use the print statement

Below is the implementation of the above approach:

C++

 `// C++ program to find minimum and maximum``// value from singly circular linked list``#include ``using` `namespace` `std;` `// structure for a node``struct` `Node {``    ``int` `data;``    ``struct` `Node* next;``};` `// Function to print minimum and maximum``// nodes of the circular linked list``void` `printMinMax(``struct` `Node** head)``{``    ``// check list is empty``    ``if` `(*head == NULL) {``        ``return``;``    ``}` `    ``// pointer for traversing``    ``struct` `Node* current;` `    ``// initialize head to current pointer``    ``current = *head;` `    ``// initialize max int value to min``    ``// initialize min int value to max``    ``int` `min = INT_MAX, max = INT_MIN;` `    ``// While last node is not reached``    ``do` `{` `        ``// If current node data is lesser for min``        ``// then replace it``        ``if` `(current->data < min) {``            ``min = current->data;``        ``}` `        ``// If current node data is greater for max``        ``// then replace it``        ``if` `(current->data > max) {``            ``max = current->data;``        ``}` `        ``current = current->next;``    ``}``     ``while``(current != *head);` `    ``cout << ``"\nMinimum = "` `<< min << ``", Maximum = "` `<< max;``}` `// Function to insert a node at the end of``// a Circular linked list``void` `insertNode(``struct` `Node** head, ``int` `data)``{``    ``struct` `Node* current = *head;``    ``// Create a new node``    ``struct` `Node* newNode = ``new` `Node;` `    ``// check node is created or not``    ``if` `(!newNode) {``        ``printf``(``"\nMemory Error\n"``);``        ``return``;``    ``}` `    ``// insert data into newly created node``    ``newNode->data = data;` `    ``// check list is empty``    ``// if not have any node then``    ``// make first node it``    ``if` `(*head == NULL) {``        ``newNode->next = newNode;``        ``*head = newNode;``        ``return``;``    ``}` `    ``// if list have already some node``    ``else` `{` `        ``// move first node to last node``        ``while` `(current->next != *head) {``            ``current = current->next;``        ``}` `        ``// put first or head node address``        ``// in new node link``        ``newNode->next = *head;` `        ``// put new node address into``        ``// last node link(next)``        ``current->next = newNode;``    ``}``}` `// Function to print the Circular linked list``void` `displayList(``struct` `Node* head)``{` `    ``struct` `Node* current = head;` `    ``// if list is empty simply show message``    ``if` `(head == NULL) {``        ``printf``(``"\nDisplay List is empty\n"``);``        ``return``;``    ``}` `    ``// traverse first to last node``    ``else` `{``        ``do` `{``            ``printf``(``"%d "``, current->data);``            ``current = current->next;``        ``} ``while` `(current != head);``    ``}``}` `// Driver Code``int` `main()``{``    ``struct` `Node* Head = NULL;` `    ``insertNode(&Head, 99);``    ``insertNode(&Head, 11);``    ``insertNode(&Head, 22);``    ``insertNode(&Head, 33);``    ``insertNode(&Head, 44);``    ``insertNode(&Head, 55);``    ``insertNode(&Head, 66);` `    ``cout << ``"Initial List: "``;` `    ``displayList(Head);` `    ``printMinMax(&Head);` `    ``return` `0;``}`

Java

 `// Java program to find minimum and maximum ``// value from singly circular linked list ``class` `GFG``{` `// structure for a node ``static` `class` `Node ``{ ``    ``int` `data; ``    ``Node next; ``}; ` `// Function to print minimum and maximum ``// nodes of the circular linked list ``static` `void` `printMinMax(Node head) ``{ ``    ``// check list is empty ``    ``if` `(head == ``null``)``    ``{ ``        ``return``; ``    ``} ` `    ``// pointer for traversing ``    ``Node current; ` `    ``// initialize head to current pointer ``    ``current = head; ` `    ``// initialize max int value to min ``    ``// initialize min int value to max ``    ``int` `min = Integer.MAX_VALUE, max = Integer.MIN_VALUE; ` `    ``// While last node is not reached ``    ``while` `(current.next != head)``    ``{ ` `        ``// If current node data is lesser for min ``        ``// then replace it ``        ``if` `(current.data < min) ``        ``{ ``            ``min = current.data; ``        ``} ` `        ``// If current node data is greater for max ``        ``// then replace it ``        ``if` `(current.data > max)``        ``{ ``            ``max = current.data; ``        ``} ` `        ``current = current.next; ``    ``} ` `    ``System.out.println( ``"\nMinimum = "` `+ min + ``", Maximum = "` `+ max); ``} ` `// Function to insert a node at the end of ``// a Circular linked list ``static` `Node insertNode(Node head, ``int` `data) ``{ ``    ``Node current = head; ``    ` `    ``// Create a new node ``    ``Node newNode = ``new` `Node(); ` `    ``// check node is created or not ``    ``if` `(newNode == ``null``) ``    ``{ ``        ``System.out.printf(``"\nMemory Error\n"``); ``        ``return` `null``; ``    ``} ` `    ``// insert data into newly created node ``    ``newNode.data = data; ` `    ``// check list is empty ``    ``// if not have any node then ``    ``// make first node it ``    ``if` `(head == ``null``) ``    ``{ ``        ``newNode.next = newNode; ``        ``head = newNode; ``        ``return` `head; ``    ``} ` `    ``// if list have already some node ``    ``else``    ``{ ` `        ``// move first node to last node ``        ``while` `(current.next != head)``        ``{ ``            ``current = current.next; ``        ``} ` `        ``// put first or head node address ``        ``// in new node link ``        ``newNode.next = head; ` `        ``// put new node address into ``        ``// last node link(next) ``        ``current.next = newNode; ``    ``} ``    ``return` `head;``} ` `// Function to print the Circular linked list ``static` `void` `displayList(Node head) ``{ ` `    ``Node current = head; ` `    ``// if list is empty simply show message ``    ``if` `(head == ``null``)``    ``{ ``        ``System.out.printf(``"\nDisplay List is empty\n"``); ``        ``return``; ``    ``} ` `    ``// traverse first to last node ``    ``else``    ``{ ``        ``do``        ``{ ``            ``System.out.printf(``"%d "``, current.data); ``            ``current = current.next; ``        ``} ``while` `(current != head); ``    ``} ``} ` `// Driver Code ``public` `static` `void` `main(String args[])``{ ``    ``Node Head = ``null``; ` `    ``Head=insertNode(Head, ``99``); ``    ``Head=insertNode(Head, ``11``); ``    ``Head=insertNode(Head, ``22``); ``    ``Head=insertNode(Head, ``33``); ``    ``Head=insertNode(Head, ``44``); ``    ``Head=insertNode(Head, ``55``); ``    ``Head=insertNode(Head, ``66``); ` `    ``System.out.println(``"Initial List: "``); ` `    ``displayList(Head); ` `    ``printMinMax(Head); ``} ``}` `// This code is contributed by Arnab Kundu`

Python3

 `# Python3 program to find minimum and maximum``# value from singly circular linked list`` ` `# structure for a node``class` `Node:``    ` `    ``def` `__init__(``self``):``        ` `        ``self``.data ``=` `0``        ``self``.``next` `=` `None``    ` `# Function to print minimum and maximum``# nodes of the circular linked list``def` `printMinMax(head):` `    ``# check list is empty``    ``if` `(head ``=``=` `None``):``        ``return``;`` ` `    ``# initialize head to current pointer``    ``current ``=` `head;`` ` `    ``# initialize max int value to min``    ``# initialize min int value to max``    ``min` `=` `1000000000``    ``max` `=` `-``1000000000``;`` ` `    ``# While last node is not reached``    ``while` `True``:`` ` `        ``# If current node data is lesser for min``        ``# then replace it``        ``if` `(current.data < ``min``):``            ``min` `=` `current.data;`` ` `        ``# If current node data is greater for max``        ``# then replace it``        ``if` `(current.data > ``max``):``            ``max` `=` `current.data;`` ` `        ``current ``=` `current.``next``;        ``        ``if``(current ``=``=` `head):``            ``break`   `    ``print``(``'Minimum = {}, Maximum = {}'``.``format``(``min``, ``max``))`` ` `# Function to insert a node at the end of``# a Circular linked list``def` `insertNode(head, data):``    ``current ``=` `head;``    ` `    ``# Create a new node``    ``newNode ``=` `Node()`` ` `    ``# check node is created or not``    ``if` `not` `newNode:``        ``print``(``"\nMemory Error"``);``        ``return` `head`` ` `    ``# insert data into newly created node``    ``newNode.data ``=` `data;`` ` `    ``# check list is empty``    ``# if not have any node then``    ``# make first node it``    ``if` `(head ``=``=` `None``):``        ``newNode.``next` `=` `newNode;``        ``head ``=` `newNode;``        ``return` `head`` ` `    ``# if list have already some node``    ``else``:`` ` `        ``# move first node to last node``        ``while` `(current.``next` `!``=` `head):``            ``current ``=` `current.``next``;`` ` `        ``# put first or head node address``        ``# in new node link``        ``newNode.``next` `=` `head;`` ` `        ``# put new node address into``        ``# last node link(next)``        ``current.``next` `=` `newNode;        ``    ``return` `head`` ` `# Function to print the Circular linked list``def` `displayList(head):``    ``current ``=` `head;`` ` `    ``# if list is empty simply show message``    ``if` `(head ``=``=` `None``):``        ``print``(``"\nDisplay List is empty"``);``        ``return``;`` ` `    ``# traverse first to last node``    ``else``:``        ` `        ``while` `True``:``            ``print``(current.data, end``=``' '``);``            ``current ``=` `current.``next``;           ``            ``if``(current``=``=``head):``                ``break``    ``print``()`` ` `# Driver Code``if` `__name__``=``=``'__main__'``:``    ` `    ``Head ``=` `None``;`` ` `    ``Head ``=` `insertNode(Head, ``99``);``    ``Head ``=` `insertNode(Head, ``11``);``    ``Head ``=` `insertNode(Head, ``22``);``    ``Head ``=` `insertNode(Head, ``33``);``    ``Head ``=` `insertNode(Head, ``44``);``    ``Head ``=` `insertNode(Head, ``55``);``    ``Head ``=` `insertNode(Head, ``66``);`` ` `    ``print``(``"Initial List: "``, end ``=` `'')`` ` `    ``displayList(Head);`` ` `    ``printMinMax(Head);`` ` `# This code is contributed by rutvik_56`

C#

 `// C# program to find minimum and maximum ``// value from singly circular linked list ``using` `System;``    ` `class` `GFG``{` `// structure for a node ``public` `class` `Node ``{ ``    ``public` `int` `data; ``    ``public` `Node next; ``}; ` `// Function to print minimum and maximum ``// nodes of the circular linked list ``static` `void` `printMinMax(Node head) ``{ ``    ``// check list is empty ``    ``if` `(head == ``null``)``    ``{ ``        ``return``; ``    ``} ` `    ``// pointer for traversing ``    ``Node current; ` `    ``// initialize head to current pointer ``    ``current = head; ` `    ``// initialize max int value to min ``    ``// initialize min int value to max ``    ``int` `min = ``int``.MaxValue, max = ``int``.MinValue; ` `    ``// While last node is not reached ``    ``while` `(current.next != head)``    ``{ ` `        ``// If current node data is lesser for min ``        ``// then replace it ``        ``if` `(current.data < min) ``        ``{ ``            ``min = current.data; ``        ``} ` `        ``// If current node data is greater for max ``        ``// then replace it ``        ``if` `(current.data > max)``        ``{ ``            ``max = current.data; ``        ``} ` `        ``current = current.next; ``    ``} ` `    ``Console.WriteLine( ``"\nMinimum = "` `+ min + ``", Maximum = "` `+ max); ``} ` `// Function to insert a node at the end of ``// a Circular linked list ``static` `Node insertNode(Node head, ``int` `data) ``{ ``    ``Node current = head; ``    ` `    ``// Create a new node ``    ``Node newNode = ``new` `Node(); ` `    ``// check node is created or not ``    ``if` `(newNode == ``null``) ``    ``{ ``        ``Console.Write(``"\nMemory Error\n"``); ``        ``return` `null``; ``    ``} ` `    ``// insert data into newly created node ``    ``newNode.data = data; ` `    ``// check list is empty ``    ``// if not have any node then ``    ``// make first node it ``    ``if` `(head == ``null``) ``    ``{ ``        ``newNode.next = newNode; ``        ``head = newNode; ``        ``return` `head; ``    ``} ` `    ``// if list have already some node ``    ``else``    ``{ ` `        ``// move first node to last node ``        ``while` `(current.next != head)``        ``{ ``            ``current = current.next; ``        ``} ` `        ``// put first or head node address ``        ``// in new node link ``        ``newNode.next = head; ` `        ``// put new node address into ``        ``// last node link(next) ``        ``current.next = newNode; ``    ``} ``    ``return` `head;``} ` `// Function to print the Circular linked list ``static` `void` `displayList(Node head) ``{ ` `    ``Node current = head; ` `    ``// if list is empty simply show message ``    ``if` `(head == ``null``)``    ``{ ``        ``Console.Write(``"\nDisplay List is empty\n"``); ``        ``return``; ``    ``} ` `    ``// traverse first to last node ``    ``else``    ``{ ``        ``do``        ``{ ``            ``Console.Write(``"{0} "``, current.data); ``            ``current = current.next; ``        ``} ``while` `(current != head); ``    ``} ``} ` `// Driver Code ``public` `static` `void` `Main()``{ ``    ``Node Head = ``null``; ` `    ``Head=insertNode(Head, 99); ``    ``Head=insertNode(Head, 11); ``    ``Head=insertNode(Head, 22); ``    ``Head=insertNode(Head, 33); ``    ``Head=insertNode(Head, 44); ``    ``Head=insertNode(Head, 55); ``    ``Head=insertNode(Head, 66); ` `    ``Console.WriteLine(``"Initial List: "``); ` `    ``displayList(Head); ` `    ``printMinMax(Head); ``} ``}` `/* This code contributed by PrinciRaj1992 */`

Javascript

 ``

Output
```Initial List: 99 11 22 33 44 55 66
Minimum = 11, Maximum = 99```

Complexity Analysis:

• Time Complexity: O(n), as we are using a loop to traverse n times. Where n is the number of nodes in the linked list.
• Auxiliary Space: O(1), as we are not using any extra space.