Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
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.
