 <p>Unfortunately, what you are trying to achieve is inherently unsafe as far as the compiler is concerned because you are creating <em>aliases</em> to <em>mutable</em> nodes. Two possible issues that the compiler will complain about:</p> <ul> <li>there is no proof that the node will not move, so the reference you take might be invalidated</li> <li>there is no proof that the node will not be mutated, so having two aliases to it (and being able to hand over two aliases to it) create a safety hole</li> </ul> <hr> <p>Now what?</p> <p>There are various approaches. If you are sure of yourself you could use <code>unsafe</code> and raw pointers, for example. However, the simpler solutions would be:</p> <ul> <li>use a <code>Vec</code> to store the nodes, and indexes to link them</li> <li>use <code>Rc</code> and <code>Weak</code></li> </ul> <p>The former is:</p> <pre><code>struct Node&lt;T&gt; { data: T, next: Option&lt;usize&gt;, random: Option&lt;usize&gt;, } pub struct List&lt;T&gt; { store: Vec&lt;Node&lt;T&gt;&gt;, } </code></pre> <p>And the latter would be:</p> <pre><code>struct Node&lt;T&gt; { data: T, next: Option&lt;Rc&lt;Node&lt;T&gt;&gt;, random: Option&lt;Weak&lt;Node&lt;T&gt;&gt;, } pub struct List&lt;T&gt; { head: Option&lt;Rc&lt;Node&lt;T&gt;&gt;, } </code></pre> <p>the latter however will not allow mutation of the internal nodes (because there is inherent aliasing) so you may need to wrap the <code>T</code> into <code>RefCell&lt;T&gt;</code>.</p>