Search an Element in Doubly Circular Linked List

Pre-requisite: Convert an Array to a Circular Doubly Linked List, Doubly Circular Linked List

Given a Doubly circular linked list. The task is to find the position of an element in the list.

Image Representation:
Search Image

Algorithm:

  • Declare a temp pointer, and initialize it to head of the list.
  • Iterate the loop until temp reaches start address (last node in the list, as it is in a circular fashion), check for the n element, whether present or not.
  • If it is present, raise a flag, increment count and break the loop.
  • At the last, as the last node is not visited yet check for the n element if present do step 3.

Below program illustrate the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to illustrate inserting a Node in 
// a Cicular Doubly Linked list in begging, end 
// and middle 
#include <bits/stdc++.h> 
using namespace std; 
  
// Structure of a Node 
struct Node 
    int data; 
    struct Node *next; 
    struct Node *prev; 
}; 
  
// Function to insert a node at the end 
void insertNode(struct Node** start, int value) 
    // If the list is empty, create a single node 
    // circular and doubly list 
    if (*start == NULL) 
    
        struct Node* new_node = new Node; 
        new_node->data = value; 
        new_node->next = new_node->prev = new_node; 
        *start = new_node; 
        return
    
  
    // If list is not empty 
  
    /* Find last node */
    Node *last = (*start)->prev; 
  
    // Create Node dynamically 
    struct Node* new_node = new Node; 
    new_node->data = value; 
  
    // Start is going to be next of new_node 
    new_node->next = *start; 
  
    // Make new node previous of start 
    (*start)->prev = new_node; 
  
    // Make last preivous of new node 
    new_node->prev = last; 
  
    // Make new node next of old last 
    last->next = new_node; 
  
// Function to display the
// circular doubly linked list
void displayList(struct Node* start) 
    struct Node *temp = start; 
  
    while (temp->next != start) 
    
        printf("%d ", temp->data); 
        temp = temp->next; 
    
    printf("%d ", temp->data); 
  
// Function to search the particular element
// from the list
int searchList(struct Node* start, int search)
{
    // Declare the temp variable
    struct Node *temp = start;
       
    // Declare other control
    // variable for the searching
    int count=0,flag=0,value;
       
    // If start is NULL return -1
    if(temp == NULL)
        return -1;
    else
    {
        // Move the temp pointer until, 
        // temp->next doesn't move
        // start address (Circular Fashion)
        while(temp->next != start)
        {
            // Increment count for location
            count++;
            // If it is found raise the
            // flag and break the loop
            if(temp->data == search)
            {
                flag = 1;
                count--;
                break;
            }
            // Increment temp pointer
            temp = temp->next;   
        }
        // Check whether last element in the
        // list content the value if contain, 
        // raise a flag and increment count
        if(temp->data == search)
        {
            count++;
            flag = 1;
        }
           
        // If flag is true, then element
        // found, else not
        if(flag == 1)
            cout<<"\n"<<search <<" found at location "<<
                                            count<<endl;
        else
            cout<<"\n"<<search <<" not found"<<endl;
    }
}
  
// Driver code
int main() 
    /* Start with the empty list */
    struct Node* start = NULL; 
  
    // Insert 4. So linked list becomes 4->NULL 
    insertNode(&start, 4);
  
    // Insert 5. So linked list becomes 4->5 
    insertNode(&start, 5);  
  
    // Insert 7. So linked list 
    // becomes 4->5->7 
    insertNode(&start, 7); 
  
    // Insert 8. So linked list 
    // becomes 4->5->7->8 
    insertNode(&start, 8); 
  
    // Insert 6. So linked list 
    // becomes 4->5->7->8->6 
    insertNode(&start, 6); 
  
    printf("Created circular doubly linked list is: "); 
    displayList(start); 
      
    searchList(start, 5);
  
    return 0; 

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to illustrate inserting  
// a Node in a Cicular Doubly Linked list 
// in begging, end and middle 
class GFG
{
      
// Structure of a Node 
static class Node 
    int data; 
    Node next; 
    Node prev; 
}; 
  
// Function to insert a node at the end 
static Node insertNode(Node start, int value) 
    // If the list is empty, create a single node 
    // circular and doubly list 
    if (start == null
    
        Node new_node = new Node(); 
        new_node.data = value; 
        new_node.next = new_node.prev = new_node; 
        start = new_node; 
        return new_node; 
    
  
    // If list is not empty 
  
    // Find last node /
    Node last = (start).prev; 
  
    // Create Node dynamically 
    Node new_node = new Node(); 
    new_node.data = value; 
  
    // Start is going to be next of new_node 
    new_node.next = start; 
  
    // Make new node previous of start 
    (start).prev = new_node; 
  
    // Make last preivous of new node 
    new_node.prev = last; 
  
    // Make new node next of old last 
    last.next = new_node; 
      
    return start;
  
// Function to display the 
// circular doubly linked list 
static void displayList(Node start) 
    Node temp = start; 
  
    while (temp.next != start) 
    
        System.out.printf("%d ", temp.data); 
        temp = temp.next; 
    
    System.out.printf("%d ", temp.data); 
  
// Function to search the particular element 
// from the list 
static int searchList(Node start, int search) 
    // Declare the temp variable 
    Node temp = start; 
      
    // Declare other control 
    // variable for the searching 
    int count = 0, flag = 0, value; 
      
    // If start is null return -1 
    if(temp == null
        return -1
    else
    
        // Move the temp pointer until, 
        // temp.next doesn't move 
        // start address (Circular Fashion) 
        while(temp.next != start) 
        
            // Increment count for location 
            count++; 
              
            // If it is found raise the 
            // flag and break the loop 
            if(temp.data == search) 
            
                flag = 1
                count--; 
                break
            
              
            // Increment temp pointer 
            temp = temp.next; 
        
          
        // Check whether last element in the 
        // list content the value if contain, 
        // raise a flag and increment count 
        if(temp.data == search) 
        
            count++; 
            flag = 1
        
          
        // If flag is true, then element 
        // found, else not 
        if(flag == 1
            System.out.println("\n"+search +" found at location "
                                            count); 
        else
            System.out.println("\n"+search +" not found"); 
    
    return -1;
  
// Driver code 
public static void main(String args[])
    // Start with the empty list /
    Node start = null
  
    // Insert 4. So linked list becomes 4.null 
    start= insertNode(start, 4); 
  
    // Insert 5. So linked list becomes 4.5 
    start= insertNode(start, 5); 
  
    // Insert 7. So linked list 
    // becomes 4.5.7 
    start= insertNode(start, 7); 
  
    // Insert 8. So linked list 
    // becomes 4.5.7.8 
    start= insertNode(start, 8); 
  
    // Insert 6. So linked list 
    // becomes 4.5.7.8.6 
    start= insertNode(start, 6); 
  
    System.out.printf("Created circular doubly linked list is: "); 
    displayList(start); 
      
    searchList(start, 5); 
}
  
// This code is contributed by Arnab Kundu

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to Reverse a List using Data Swapping 
using System;
  
class GFG
{
      
    // Structure of a Node 
    public class Node 
    
        public int data; 
        public Node next; 
        public Node prev; 
    }; 
      
    // Function to insert a node at the end 
    static Node insertNode(Node start, int value) 
    
        // If the list is empty, create a single node 
        // circular and doubly list 
        Node new_node = new Node(); 
        if (start == null
        
              
            new_node.data = value; 
            new_node.next = new_node.prev = new_node; 
            start = new_node; 
            return new_node; 
        
      
        // If list is not empty 
      
        // Find last node /
        Node last = (start).prev; 
      
        // Create Node dynamically 
        new_node = new Node(); 
        new_node.data = value; 
      
        // Start is going to be next of new_node 
        new_node.next = start; 
      
        // Make new node previous of start 
        (start).prev = new_node; 
      
        // Make last preivous of new node 
        new_node.prev = last; 
      
        // Make new node next of old last 
        last.next = new_node; 
          
        return start;
    
      
    // Function to display the 
    // circular doubly linked list 
    static void displayList(Node start) 
    
        Node temp = start; 
      
        while (temp.next != start) 
        
            Console.Write("{0} ", temp.data); 
            temp = temp.next; 
        
        Console.Write("{0} ", temp.data); 
    
      
    // Function to search the particular element 
    // from the list 
    static int searchList(Node start, int search) 
    
        // Declare the temp variable 
        Node temp = start; 
          
        // Declare other control 
        // variable for the searching 
        int count = 0, flag = 0, value; 
          
        // If start is null return -1 
        if(temp == null
            return -1; 
        else
        
            // Move the temp pointer until, 
            // temp.next doesn't move 
            // start address (Circular Fashion) 
            while(temp.next != start) 
            
                // Increment count for location 
                count++; 
                  
                // If it is found raise the 
                // flag and break the loop 
                if(temp.data == search) 
                
                    flag = 1; 
                    count--; 
                    break
                
                  
                // Increment temp pointer 
                temp = temp.next; 
            
              
            // Check whether last element in the 
            // list content the value if contain, 
            // raise a flag and increment count 
            if(temp.data == search) 
            
                count++; 
                flag = 1; 
            
              
            // If flag is true, then element 
            // found, else not 
            if(flag == 1) 
                Console.WriteLine("\n"+search +" found at location "
                                                count); 
            else
                Console.WriteLine("\n"+search +" not found"); 
        
        return -1;
    
      
    // Driver code 
    public static void Main(String []args)
    
        // Start with the empty list /
        Node start = null
      
        // Insert 4. So linked list becomes 4.null 
        start= insertNode(start, 4); 
      
        // Insert 5. So linked list becomes 4.5 
        start= insertNode(start, 5); 
      
        // Insert 7. So linked list 
        // becomes 4.5.7 
        start= insertNode(start, 7); 
      
        // Insert 8. So linked list 
        // becomes 4.5.7.8 
        start= insertNode(start, 8); 
      
        // Insert 6. So linked list 
        // becomes 4.5.7.8.6 
        start= insertNode(start, 6); 
      
        Console.Write("Created circular doubly linked list is: "); 
        displayList(start); 
          
        searchList(start, 5); 
    
}
  
// This code has been contributed by 29AjayKumar

chevron_right


Output:

Created circular doubly linked list is: 4 5 7 8 6 
5 found at location 2

Time Complexity: As it uses linear search, so complexity is O(n).



My Personal Notes arrow_drop_up

सर्वशक्तिशाली इकलौता

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 Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : andrew1234, 29AjayKumar