Searching an Element in Doubly Circular Linked List using C++

Given a double circular linked list and key, we have to search the key in the linked list and give a proper message if found. Suppose we have a linked list with the specific characters, and we have to search for an element in it. So let's start with the following linked list ?

<-> 5 <-> 8 <-> 9 <-> 2 <-> 4 <->

We will use 4 as a key to finding the solution to the given problem. A double-linked list has no fixed head, so we will start from any node and then mark that node as head, and till we hit this head again, we do a linear search over the linked list and search for the key.

Let's see some input-output scenarios ?

Assume, we are having a doubly circular linked list having 5 nodes <-> 3 <-> 4<-> 5<-> 6<-> 7<-> in it and the element to be found is 6.

Input = <-> 3 <-> 4<-> 5<-> 6<-> 7<-> key=6
Output = Element found

Let?s consider another scenario where the element to be searched is not present in the doubly circular linked list.

Input = <-> 10<->20<->30<->40<->50<-> key=100
Output = Element not found

Algorithm

The below following steps are the way of approach.

  • Implement a linked list and pass values to the nodes by assigning the forward node in each node of the linked list.

  • Assigning previous part of the node to the next part of the last node.

  • Assigning every previous part of the node to next part of the node.

  • Passing the key element to check whether it is present in the doubly circular linked list.

  • If the key is present in the doubly circular linked list, returns true.

  • Else, it returns false.

Example

Following is the C++ implementation code to perform search operation in a doubly linked list ?

<div class="execute"></div><div class="code-mirror  language-cpp" contenteditable="plaintext-only" spellcheck="false" style="outline: none; overflow-wrap: break-word; overflow-y: auto; white-space: pre-wrap;"><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">class</span> <span class="token class-name">Node</span> <span class="token punctuation">{</span>
   <span class="token keyword">public</span><span class="token operator">:</span>
   <span class="token keyword">int</span> val<span class="token punctuation">;</span>
   Node <span class="token operator">*</span>left<span class="token punctuation">,</span> <span class="token operator">*</span>right<span class="token punctuation">;</span>
   <span class="token function">Node</span><span class="token punctuation">(</span><span class="token keyword">int</span> val<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token operator">-></span>val <span class="token operator">=</span> val<span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">bool</span> <span class="token function">solve</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> root<span class="token punctuation">,</span> <span class="token keyword">int</span> key<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   Node<span class="token operator">*</span> copy <span class="token operator">=</span> root<span class="token punctuation">;</span>
   <span class="token keyword">do</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span><span class="token punctuation">(</span>copy<span class="token operator">-></span>val <span class="token operator">==</span> key<span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
      copy <span class="token operator">=</span> copy<span class="token operator">-></span>right<span class="token punctuation">;</span>
   <span class="token punctuation">}</span><span class="token keyword">while</span><span class="token punctuation">(</span>copy<span class="token operator">!=</span>root<span class="token punctuation">)</span><span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token comment">// assigning the forward node in each node of the linked list</span>
   Node<span class="token operator">*</span> phead <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token function">Node</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right <span class="token operator">=</span> phead<span class="token punctuation">;</span>
 
   <span class="token comment">// assignment of the previous node in each node in the linked list</span>
 
   <span class="token comment">// assigning the previous of the head to the last element</span>
   phead<span class="token operator">-></span>left <span class="token operator">=</span> phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token punctuation">;</span>

   <span class="token comment">// assigning the left node in each node of the linked list</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> phead<span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> phead<span class="token operator">-></span>right<span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token punctuation">;</span>
   phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>left <span class="token operator">=</span> phead<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token operator">-></span>right<span class="token punctuation">;</span>
   <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">solve</span><span class="token punctuation">(</span>phead<span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span> cout <span class="token operator"><<</span> <span class="token string">"Element present"</span><span class="token punctuation">;</span> <span class="token keyword">else</span> cout <span class="token operator"><<</span> <span class="token string">"Element not present"</span><span class="token punctuation">;</span>
   <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</div><div class="output-wrapper"><div class="console-close"></div><div class="code-output"></div></div>

Output

Element present

Explanation

The key 4 is present in the double linked list.

Conclusion

In a doubly circular linked list, we can start from anywhere as there is no fixed head and no fixed tail. In the above approach, we have a "head," which is a pseudo head from where we would start our search. The time complexity of the above algorithm is O(n) as a linear search.

Updated on: 2022-08-10T09:56:26+05:30

351 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements