<span class="hljs-keyword">namespace</span> LinkedList<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">interface</span>
<span class="hljs-keyword">uses</span>
System.Text<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">type</span>
List<T> = <span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span>
<span class="hljs-keyword">where</span> T <span class="hljs-keyword">is</span> Object<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">private</span>
<span class="hljs-keyword">method</span> <span class="hljs-title function_">AppendToString</span><span class="hljs-params">(aBuilder: StringBuilder)</span>;
<span class="hljs-keyword">public</span>
<span class="hljs-keyword">constructor</span><span class="hljs-params">(aData: T)</span>;
<span class="hljs-keyword">constructor</span><span class="hljs-params">(aData: T; aNext: List<T>)</span>;
<span class="hljs-keyword">property</span> Next: List<T><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">property</span> Data: T<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">method</span> <span class="hljs-title function_">ToString</span>: string<span class="hljs-punctuation">;</span> <span class="hljs-keyword">override</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">implementation</span>
<span class="hljs-keyword">constructor</span> <span class="hljs-title function_">List</span><<span class="hljs-title function_">T</span>><span class="hljs-params">(aData: T)</span>;
<span class="hljs-keyword">begin</span>
Data := aData<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">constructor</span> <span class="hljs-title function_">List</span><<span class="hljs-title function_">T</span>><span class="hljs-params">(aData: T; aNext: List<T>)</span>;
<span class="hljs-keyword">begin</span>
<span class="hljs-keyword">constructor</span><span class="hljs-params">(aData)</span>;
Next := aNext<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">method</span> <span class="hljs-title function_">List</span><<span class="hljs-title function_">T</span>>.<span class="hljs-title function_">ToString</span>: string<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">begin</span>
<span class="hljs-keyword">with</span> lBuilder := <span class="hljs-keyword">new</span> StringBuilder <span class="hljs-keyword">do</span> <span class="hljs-keyword">begin</span>
AppendToString(lBuilder)<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">result</span> := lBuilder.ToString()<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">method</span> <span class="hljs-title function_">List</span><<span class="hljs-title function_">T</span>>.<span class="hljs-title function_">AppendToString</span><span class="hljs-params">(aBuilder: StringBuilder)</span>;
<span class="hljs-keyword">begin</span>
<span class="hljs-keyword">if</span> assigned(Data) <span class="hljs-keyword">then</span>
aBuilder.Append(Data.ToString)
<span class="hljs-keyword">else</span>
aBuilder.Append(<span class="hljs-string">'nil'</span>)<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">if</span> assigned(Next) <span class="hljs-keyword">then</span> <span class="hljs-keyword">begin</span>
aBuilder.Append(<span class="hljs-string">', '</span>)<span class="hljs-punctuation">;</span>
Next.AppendToString(aBuilder)<span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span><span class="hljs-punctuation">;</span>
<span class="hljs-keyword">end</span>.