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
Replace each node with its Surpasser Count in Linked List Using C++
We are given a linked list, and we need to find elements in the given linked list which are greater and present in the right of the current element. The count of these elements needs to be substituted into the current node's value.
Let's take a linked list with the following characters and replace each node with its Surpasser count ?
4 -> 6 -> 1 -> 4 -> 6 -> 8 -> 5 -> 8 -> 3
From backward, traverse the linked list (so we do not need to worry about elements to the left of the current). Our data structure keeps track of current elements in sorted order. Replace the current element in our sorted data structure with the total number of elements above it.
By the recursion method, the linked list will be traversed backward. An alternative is PBDS. The use of PBDS allows us to find elements that are strictly smaller than a certain key. We can add the current element and subtract it from an element that is strictly smaller.
PBDS does not allow duplicate elements. However, we need duplicate elements for counting. In order to make each entry unique, we will insert a pair in PBDS (first = element, second = index). To find total elements equal to the current element, we will then use a hash map. A hashmap stores the number of occurrences of each element (a basic integer to integer map).
Example
Following is the C++ program to replace each node in a linked list with its surpasser count ?
<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"><unordered_map></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><ext/pb_ds/assoc_container.hpp></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><ext/pb_ds/tree_policy.hpp></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">oset</span> <span class="token expression">tree<span class="token operator"><</span>pair<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span><span class="token punctuation">,</span> null_type<span class="token punctuation">,</span>less<span class="token operator"><</span>pair<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">>></span><span class="token punctuation">,</span> rb_tree_tag<span class="token punctuation">,</span> tree_order_statistics_node_update<span class="token operator">></span></span></span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span>
<span class="token keyword">using</span> <span class="token keyword">namespace</span> __gnu_pbds<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> value<span class="token punctuation">;</span>
Node <span class="token operator">*</span> next<span class="token punctuation">;</span>
<span class="token function">Node</span> <span class="token punctuation">(</span><span class="token keyword">int</span> value<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">this</span><span class="token operator">-></span>value <span class="token operator">=</span> value<span class="token punctuation">;</span>
next <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">void</span> <span class="token function">solve</span> <span class="token punctuation">(</span>Node <span class="token operator">*</span> head<span class="token punctuation">,</span> oset <span class="token operator">&</span> os<span class="token punctuation">,</span> unordered_map <span class="token operator"><</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">></span><span class="token operator">&</span>mp<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&</span>count<span class="token punctuation">)</span><span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>head <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
<span class="token keyword">return</span><span class="token punctuation">;</span>
<span class="token function">solve</span> <span class="token punctuation">(</span>head<span class="token operator">-></span>next<span class="token punctuation">,</span> os<span class="token punctuation">,</span> mp<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
count<span class="token operator">++</span><span class="token punctuation">;</span>
os<span class="token punctuation">.</span><span class="token function">insert</span> <span class="token punctuation">(</span>
<span class="token punctuation">{</span>
head<span class="token operator">-></span>value<span class="token punctuation">,</span> count<span class="token punctuation">}</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>
mp<span class="token punctuation">[</span>head<span class="token operator">-></span>value<span class="token punctuation">]</span><span class="token operator">++</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> numberOfElements <span class="token operator">=</span> count <span class="token operator">-</span> mp<span class="token punctuation">[</span>head<span class="token operator">-></span>value<span class="token punctuation">]</span> <span class="token operator">-</span> os<span class="token punctuation">.</span><span class="token function">order_of_key</span> <span class="token punctuation">(</span><span class="token punctuation">{</span> head<span class="token operator">-></span>value<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>value <span class="token operator">=</span> numberOfElements<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">void</span> <span class="token function">printList</span> <span class="token punctuation">(</span>Node <span class="token operator">*</span> head<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span>head<span class="token punctuation">)</span> <span class="token punctuation">{</span>
cout <span class="token operator"><<</span> head<span class="token operator">-></span>value <span class="token operator"><<</span> <span class="token punctuation">(</span>head<span class="token operator">-></span>next <span class="token operator">?</span> <span class="token string">"->"</span> <span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head <span class="token operator">=</span> head<span class="token operator">-></span>next<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
cout <span class="token operator"><<</span> <span class="token string">"\n"</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>
Node <span class="token operator">*</span> head <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">43</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next <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">65</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next <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">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">46</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">68</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">85</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">59</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">85</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
head<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next<span class="token operator">-></span>next <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">37</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
oset os<span class="token punctuation">;</span>
unordered_map <span class="token operator"><</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">></span>mp<span class="token punctuation">;</span>
<span class="token keyword">int</span> count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token function">printList</span> <span class="token punctuation">(</span>head<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">solve</span> <span class="token punctuation">(</span>head<span class="token punctuation">,</span> os<span class="token punctuation">,</span> mp<span class="token punctuation">,</span> count<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">printList</span> <span class="token punctuation">(</span>head<span class="token punctuation">)</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
43->65->12->46->68->85->59->85->30 6->3->6->4->2->0->1->0->0
Explanation
So for 1st element, element = [65, 46, 68, 85, 59, 85] which is 6
2nd element, element = [68, 85, 85] which is 3
And so on for all elements
Conclusion
This problem requires some understanding of data structures and recursion. We need to list down the approach, and then from observation and knowledge, we deduce a data structure for our requirement. If you like this article, read more and stay tuned.
