C++ program to Replace Nodes with Duplicates in Linked List

In this article, we are given a linked list that contains elements from 1 to n and duplicates. Elements 1 to n will always be there with duplicates from [1..n]. We need to replace every duplicate element with n+1, n+2, and so on.

Lets consider an example

1?2?2?4?5?3?6?6

Next n = 42. So every duplicate is replaced with n+1, n+2, and so on. The next 42 is replaced with 47, and the next 46 is replaced with 48, leaving the first instance as it is.

First of all, we need to construct a binary tree in the main method as shown below ?

<span class="typ">Node</span><span class="pun">*</span><span class="pln"> head </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">6</span><span class="pun">);</span><span class="pln">
head</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pun">-></span><span class="kwd">next</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Node</span><span class="pun">(</span><span class="lit">6</span><span class="pun">);</span><span class="pln">
solve</span><span class="pun">(</span><span class="pln">head</span><span class="pun">);</span>

Now the Nodes are as follows;

1?2?7?4?5?3?6?8

As we can observe, we need to keep track of the elements we saw to find the starting value of n. We also need a mechanism to figure out which elements are repeated to replace their values.

A proposed data structure that immediately comes to mind is set. We can traverse the linked list and push the elements into the set. After pushing elements in the set, we can find the last element, the largest element available in the linked list, as the set is a sorted data structure.

In the second traversal of the linked list, we can use the set as a hash. We will search each element in the set, and two conditions may occur.

  • We find the element in the set and then remove it from the set, making it marked.

  • We don't find the element in the set, and it means that we have already seen it from option one, and we will replace it with the next n.

Example

To implement replacing the nodes with duplicate values in a linked list, follow the C++ program below. The C++ implementation makes use of the set data structure to traverse the linked list which in turn helps in searching for the duplicate elements.

<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"><set></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> 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> <span class="token punctuation">{</span>
   set<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> hash<span class="token punctuation">;</span>
   Node<span class="token operator">*</span> copy <span class="token operator">=</span> head<span class="token punctuation">;</span>
   <span class="token keyword">while</span><span class="token punctuation">(</span>copy<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      hash<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>copy<span class="token operator">-></span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
      copy <span class="token operator">=</span> copy<span class="token operator">-></span>next<span class="token punctuation">;</span>
   <span class="token punctuation">}</span>
   <span class="token keyword">auto</span> it <span class="token operator">=</span> hash<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   it<span class="token operator">--</span><span class="token punctuation">;</span>
   <span class="token keyword">int</span> startingN <span class="token operator">=</span> <span class="token operator">*</span>it <span class="token operator">+</span><span class="token number">1</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>
      <span class="token keyword">if</span><span class="token punctuation">(</span>hash<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span>head<span class="token operator">-></span>value<span class="token punctuation">)</span> <span class="token operator">!=</span> hash<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
         hash<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>head<span class="token operator">-></span>value<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
         head<span class="token operator">-></span>value <span class="token operator">=</span> startingN<span class="token operator">++</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>
<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 string">" "</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>
<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">41</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">42</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">42</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">44</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">45</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">43</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">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>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>
   cout <span class="token operator"><<</span> <span class="token string">"Before: "</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>
   cout <span class="token operator"><<</span> <span class="token string">"\n"</span><span class="token punctuation">;</span>
   <span class="token function">solve</span><span class="token punctuation">(</span>head<span class="token punctuation">)</span><span class="token punctuation">;</span>
   cout <span class="token operator"><<</span> <span class="token string">"After: "</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

Before: 41 42 42 44 45 43 46 46
After: 41 42 47 44 45 43 46 48  

Conclusion

We used the concept of hashing and found the largest element in the linked list with the help of a data structure set. We could have also used map or unordered_map as a hash.

Updated on: 2022-08-10T09:49:07+05:30

465 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements