<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tarang</title>
    <description>The latest articles on DEV Community by Tarang (@tarangnagda).</description>
    <link>https://dev.to/tarangnagda</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4133079%2F735af42b-cb83-4ba1-9341-cc4116a21aa5.jpg</url>
      <title>DEV Community: Tarang</title>
      <link>https://dev.to/tarangnagda</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tarangnagda"/>
    <language>en</language>
    <item>
      <title>A classic linked list problem: reorder the list (mental model and dry run)</title>
      <dc:creator>Tarang</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:10:37 +0000</pubDate>
      <link>https://dev.to/tarangnagda/a-classic-linked-list-problem-reorder-the-list-mental-model-and-dry-run-284</link>
      <guid>https://dev.to/tarangnagda/a-classic-linked-list-problem-reorder-the-list-mental-model-and-dry-run-284</guid>
      <description>&lt;h2&gt;
  
  
  Reorder the linked list
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A classic linked list problem&lt;/strong&gt; — one exercise that brushes several core ideas at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;finding the middle&lt;/strong&gt; (slow / fast pointers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;reversing&lt;/strong&gt; a chain in place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;merging&lt;/strong&gt; two lists by rewiring &lt;code&gt;next&lt;/code&gt; pointers&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Given the head of a singly linked list, the list can be written as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L0 → L1 → … → Ln-1 → Ln
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reorder it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example with numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 → 2 → 3 → 4 → 5   becomes   1 → 5 → 2 → 4 → 3
1 → 2 → 3 → 4       becomes   1 → 4 → 2 → 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Mental model: three steps
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;step 1: find the middle of the list
step 2: reverse the second half
step 3: merge the two halves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   L0 → L1 → … → slow | slow.next → … → Ln
        |
        +-- firstll                    secondll (then reversed)
        |
        v
   zip: L0 → Ln → L1 → Ln-1 → …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After step 1 you have &lt;strong&gt;firstll&lt;/strong&gt; (head) and &lt;strong&gt;secondll&lt;/strong&gt; (&lt;code&gt;slow.next&lt;/code&gt;). Set &lt;code&gt;slow.next = null&lt;/code&gt; so the list is cut in two. Step 2 makes &lt;strong&gt;secondll&lt;/strong&gt; start at the old tail. Step 3 alternates links between &lt;strong&gt;firstll&lt;/strong&gt; and &lt;strong&gt;secondll&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Find the middle (dry run)
&lt;/h2&gt;

&lt;p&gt;Code shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;slow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Move &lt;code&gt;fast&lt;/code&gt; two steps first.&lt;/strong&gt; Only if &lt;code&gt;fast&lt;/code&gt; is still non-null do you move &lt;code&gt;slow&lt;/code&gt; one step. If &lt;code&gt;fast&lt;/code&gt; becomes null, stop &lt;strong&gt;without&lt;/strong&gt; moving &lt;code&gt;slow&lt;/code&gt; again.&lt;/p&gt;

&lt;h3&gt;
  
  
  Odd: &lt;code&gt;1 → 2 → 3 → 4 → 5&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loop&lt;/th&gt;
&lt;th&gt;fast after &lt;code&gt;fast = fast.next.next&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;slow after&lt;/th&gt;
&lt;th&gt;stop?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;break&lt;/code&gt; (slow unchanged)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;firstll&lt;/code&gt;: &lt;code&gt;1 → 2 → 3&lt;/code&gt; (&lt;code&gt;slow.next = null&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;secondll&lt;/code&gt;: &lt;code&gt;4 → 5&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Even: &lt;code&gt;1 → 2 → 3 → 4&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Loop&lt;/th&gt;
&lt;th&gt;fast after jump&lt;/th&gt;
&lt;th&gt;slow after&lt;/th&gt;
&lt;th&gt;stop?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;break&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;firstll&lt;/code&gt;: &lt;code&gt;1 → 2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;secondll&lt;/code&gt;: &lt;code&gt;3 → 4&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2 — Reverse secondll (dry run)
&lt;/h2&gt;

&lt;p&gt;Same loop as in your code: &lt;code&gt;curr&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;, &lt;code&gt;future&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;future&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;future&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Starting from &lt;code&gt;4 → 5&lt;/code&gt; (odd example)&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;curr&lt;/th&gt;
&lt;th&gt;future&lt;/th&gt;
&lt;th&gt;after &lt;code&gt;curr.next = prev&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;prev&lt;/th&gt;
&lt;th&gt;curr next&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;null ← 4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;null ← 4 ← 5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;secondll = prev&lt;/code&gt; → &lt;strong&gt;&lt;code&gt;5 → 4&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting from &lt;code&gt;3 → 4&lt;/code&gt; (even example)&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;4 → 3&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Merge (dry run)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;secondllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;firstllnext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;secondllnext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;firstll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each iteration: save both &lt;code&gt;.next&lt;/code&gt;, plug &lt;strong&gt;second&lt;/strong&gt; right after &lt;strong&gt;first&lt;/strong&gt;, put the saved first &lt;code&gt;.next&lt;/code&gt; after &lt;strong&gt;second&lt;/strong&gt;, then walk both pointers forward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Odd example — after step 1 and 2
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firstll:  1 → 2 → 3
secondll: 5 → 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Round&lt;/th&gt;
&lt;th&gt;firstll&lt;/th&gt;
&lt;th&gt;secondll&lt;/th&gt;
&lt;th&gt;wires&lt;/th&gt;
&lt;th&gt;list from head&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;start&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;two separate chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1→5, 5→2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1 → 5 → 2 → 3&lt;/code&gt; and &lt;code&gt;4&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;2→4, 4→3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1 → 5 → 2 → 4 → 3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;done&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;loop ends&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;1 → 5 → 2 → 4 → 3&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When &lt;code&gt;secondll&lt;/code&gt; is null, &lt;code&gt;3&lt;/code&gt; is already the tail. No extra work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Even example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;firstll:  1 → 2
secondll: 4 → 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Round&lt;/th&gt;
&lt;th&gt;firstll&lt;/th&gt;
&lt;th&gt;secondll&lt;/th&gt;
&lt;th&gt;list from head&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;1 → 4 → 2&lt;/code&gt; and &lt;code&gt;3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;1 → 4 → 2 → 3&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Full solution (JavaScript)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;reorderList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;fast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;slow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;slow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;future&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;future&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;curr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;curr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;future&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;secondllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;firstllnext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;secondllnext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;firstll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;secondll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nx"&gt;firstll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;firstllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;secondll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;secondllnext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;firstll&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The list is reordered &lt;strong&gt;in place&lt;/strong&gt; starting from &lt;code&gt;head&lt;/code&gt;. The return value is not what you use; the rewired nodes from &lt;code&gt;head&lt;/code&gt; are the answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to remember
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Variables in your code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Middle&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;slow&lt;/code&gt;, &lt;code&gt;fast&lt;/code&gt;, then &lt;code&gt;firstll&lt;/code&gt; / &lt;code&gt;secondll&lt;/code&gt;, cut with &lt;code&gt;slow.next = null&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverse&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;curr&lt;/code&gt;, &lt;code&gt;prev&lt;/code&gt;, &lt;code&gt;future&lt;/code&gt; → &lt;code&gt;secondll = prev&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;firstllnext&lt;/code&gt;, &lt;code&gt;secondllnext&lt;/code&gt;, alternate &lt;code&gt;.next&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is always: &lt;strong&gt;split → reverse the back → zip&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>linkedlist</category>
      <category>algorithms</category>
      <category>reorderlinkedlist</category>
    </item>
    <item>
      <title>REST API methods and DNS, in one place</title>
      <dc:creator>Tarang</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:57:31 +0000</pubDate>
      <link>https://dev.to/tarangnagda/rest-api-methods-and-dns-in-one-place-5c70</link>
      <guid>https://dev.to/tarangnagda/rest-api-methods-and-dns-in-one-place-5c70</guid>
      <description>&lt;h2&gt;
  
  
  Two pieces of the same web
&lt;/h2&gt;

&lt;p&gt;Browsers and apps need two different kinds of answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST&lt;/strong&gt; — what action to take on data (read, create, replace, change a part, delete).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS&lt;/strong&gt; — which server on the internet owns a name like &lt;code&gt;www.instagram.com&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post covers both. They do not depend on each other, but you meet them on almost every project.&lt;/p&gt;




&lt;h2&gt;
  
  
  REST API methods
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;REST&lt;/strong&gt; API exposes &lt;strong&gt;resources&lt;/strong&gt; (users, orders, posts) at URLs. The &lt;strong&gt;HTTP method&lt;/strong&gt; tells the server what to do with that resource.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Fetch data without changing it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POST&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Create&lt;/td&gt;
&lt;td&gt;Add a &lt;strong&gt;new&lt;/strong&gt; resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PUT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Replace&lt;/td&gt;
&lt;td&gt;Swap the &lt;strong&gt;whole&lt;/strong&gt; resource at that URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PATCH&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Partial update&lt;/td&gt;
&lt;td&gt;Change &lt;strong&gt;some&lt;/strong&gt; fields only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DELETE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remove&lt;/td&gt;
&lt;td&gt;Delete the resource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All of these usually run over &lt;strong&gt;HTTPS&lt;/strong&gt; on top of TCP.&lt;/p&gt;

&lt;h3&gt;
  
  
  GET — get the data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GET&lt;/strong&gt; is for reading. It should not create, update, or delete on the server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/students/345&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api.example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response might be JSON with the student’s name and section. Safe to retry: calling GET twice does not change the database.&lt;/p&gt;

&lt;h3&gt;
  
  
  POST — create
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;POST&lt;/strong&gt; &lt;strong&gt;creates&lt;/strong&gt; something new. The client sends a body; the server assigns an id and stores a new row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/students&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;POST is &lt;strong&gt;not&lt;/strong&gt; for replacing an existing student in one shot. It is for &lt;strong&gt;adding&lt;/strong&gt; a new record. POST is &lt;strong&gt;not&lt;/strong&gt; idempotent: sending the same POST twice often creates &lt;strong&gt;two&lt;/strong&gt; students unless the API has extra rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  PUT — replace the whole resource
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PUT&lt;/strong&gt; means “here is the &lt;strong&gt;full&lt;/strong&gt; new version at this URL.” If student &lt;code&gt;345&lt;/code&gt; exists, PUT overwrites &lt;strong&gt;all&lt;/strong&gt; fields you model at that URL. Missing fields might become empty or default, depending on the API design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;PUT&lt;/span&gt; &lt;span class="nn"&gt;/students/345&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Asha"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PUT is for &lt;strong&gt;replace&lt;/strong&gt;, not “create with auto id” in the usual REST style. Some APIs allow PUT to create when the client chooses the id in the path; POST is still the usual way to create with a server-generated id.&lt;/p&gt;

&lt;p&gt;PUT is &lt;strong&gt;idempotent&lt;/strong&gt;: repeating the same PUT leaves the resource in the same state.&lt;/p&gt;

&lt;h3&gt;
  
  
  PATCH — replace part of the data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;PATCH&lt;/strong&gt; updates &lt;strong&gt;only what you send&lt;/strong&gt;. Change the section without resending the whole student.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;PATCH&lt;/span&gt; &lt;span class="nn"&gt;/students/345&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Name and other fields stay as they were. Use PATCH when the client should not need to read the full object, change one field, and PUT everything back.&lt;/p&gt;

&lt;h3&gt;
  
  
  DELETE — delete the data
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;DELETE&lt;/strong&gt; removes the resource at that URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;DELETE&lt;/span&gt; &lt;span class="nn"&gt;/students/345&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a successful delete, &lt;code&gt;GET /students/345&lt;/code&gt; might return &lt;strong&gt;404 Not Found&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST   → new resource        (create)
GET    → read                 (no change)
PUT    → whole resource       (full replace)
PATCH  → part of resource     (partial update)
DELETE → remove resource
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  DNS — Domain Name System
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DNS&lt;/strong&gt; (Domain Name System) turns &lt;strong&gt;hostnames&lt;/strong&gt; people type into &lt;strong&gt;IP addresses&lt;/strong&gt; computers use to connect. It is a distributed lookup system, not a single registry file on one machine.&lt;/p&gt;

&lt;p&gt;When someone opens &lt;code&gt;www.instagram.com&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;browser&lt;/strong&gt; asks the OS for that name.
&lt;/li&gt;
&lt;li&gt;The OS asks a &lt;strong&gt;recursive resolver&lt;/strong&gt; (often from your ISP or &lt;code&gt;8.8.8.8&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;The resolver walks the DNS hierarchy — root → &lt;code&gt;.com&lt;/code&gt; → &lt;code&gt;instagram.com&lt;/code&gt; → &lt;code&gt;www&lt;/code&gt; — and finds a record such as an &lt;strong&gt;A record&lt;/strong&gt; (IPv4) or &lt;strong&gt;AAAA&lt;/strong&gt; (IPv6).
&lt;/li&gt;
&lt;li&gt;The browser opens &lt;strong&gt;HTTPS&lt;/strong&gt; to that IP. TLS still checks the certificate matches &lt;code&gt;www.instagram.com&lt;/code&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;user types www.instagram.com
        |
        v
   DNS lookup  -----&amp;gt;  returns e.g. 157.240.x.x
        |
        v
   TCP + TLS + HTTP to that server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Registering&lt;/strong&gt; a domain (buying &lt;code&gt;example.com&lt;/code&gt;) is a separate step from day-to-day DNS. A &lt;strong&gt;registrar&lt;/strong&gt; records that you own the name. You (or your host) publish &lt;strong&gt;DNS records&lt;/strong&gt; that say which IP or CDN serves &lt;code&gt;www&lt;/code&gt; and mail. Those records live on &lt;strong&gt;authoritative name servers&lt;/strong&gt; for your zone. The world’s resolvers cache answers for a while (&lt;strong&gt;TTL&lt;/strong&gt;) so not every click hits the root.&lt;/p&gt;

&lt;p&gt;Common record types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Record&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A / AAAA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hostname → IP address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CNAME&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Alias → another hostname&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mail for the domain&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Without DNS, you would need to remember numeric IPs for every site. With DNS, you remember the name; the system routes you to the right server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;REST methods&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What should the server do to this resource?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DNS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Which machine lives at this hostname?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A mobile app might &lt;strong&gt;GET&lt;/strong&gt; &lt;code&gt;/feed&lt;/code&gt; on &lt;code&gt;api.instagram.com&lt;/code&gt;. DNS is what resolved &lt;code&gt;api.instagram.com&lt;/code&gt; before the GET ever left the phone.&lt;/p&gt;

</description>
      <category>rest</category>
      <category>api</category>
      <category>dns</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Types of connections: HTTP, TLS, WebSocket, gRPC, TCP, and UDP</title>
      <dc:creator>Tarang</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:35:28 +0000</pubDate>
      <link>https://dev.to/tarangnagda/types-of-connections-http-tls-websocket-grpc-tcp-and-udp-346n</link>
      <guid>https://dev.to/tarangnagda/types-of-connections-http-tls-websocket-grpc-tcp-and-udp-346n</guid>
      <description>&lt;h2&gt;
  
  
  What are types of connections?
&lt;/h2&gt;

&lt;p&gt;When two programs talk over a network, they agree on &lt;strong&gt;layers&lt;/strong&gt;. The &lt;strong&gt;transport&lt;/strong&gt; layer moves bytes reliably or quickly. The &lt;strong&gt;application&lt;/strong&gt; layer is the language those bytes mean: a web page, a chat message, a remote procedure call.&lt;/p&gt;

&lt;p&gt;Keep two levels in mind:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP, HTTPS, WebSocket, gRPC&lt;/td&gt;
&lt;td&gt;What the conversation is about&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TCP, UDP&lt;/td&gt;
&lt;td&gt;How bytes get from client to server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Application protocols usually sit on top of TCP or UDP. HTTPS and WebSocket still use TCP underneath.&lt;/p&gt;




&lt;h2&gt;
  
  
  TCP: the three-way handshake
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TCP&lt;/strong&gt; (Transmission Control Protocol) is connection-oriented. Before data flows, client and server agree the link is open. That agreement is the &lt;strong&gt;three-way handshake&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The handshake is three messages: &lt;strong&gt;SYN → SYN-ACK → ACK&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client                          server
   |---- SYN --------------------&amp;gt;|
   |&amp;lt;--- SYN-ACK -----------------|
   |---- ACK --------------------&amp;gt;|
   |         connection ready      |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SYN&lt;/strong&gt; — client asks to open a connection
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SYN-ACK&lt;/strong&gt; — server agrees and responds
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACK&lt;/strong&gt; — client confirms
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After this, both sides can send data. TCP also re-sends lost packets and keeps order. That reliability costs a little latency compared to UDP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt;, &lt;strong&gt;HTTPS&lt;/strong&gt;, &lt;strong&gt;WebSocket&lt;/strong&gt;, and &lt;strong&gt;gRPC&lt;/strong&gt; (over HTTP/2) typically use TCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  UDP: no handshake, no guarantee
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;UDP&lt;/strong&gt; (User Datagram Protocol) is connectionless. The client sends &lt;strong&gt;datagrams&lt;/strong&gt; (packets) without opening a session first. There is &lt;strong&gt;no three-way handshake&lt;/strong&gt;. The server does not send an ACK for every packet the way TCP does.&lt;/p&gt;

&lt;p&gt;UDP is faster and lighter. It fits live video, DNS lookups, and games where a lost frame is acceptable. If you need every byte and strict order, use TCP.&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTP&lt;/strong&gt; (Hypertext Transfer Protocol) is the application protocol of the web. A client sends a &lt;strong&gt;request&lt;/strong&gt; (method, path, headers). A server sends a &lt;strong&gt;response&lt;/strong&gt; (status code, headers, body).&lt;/p&gt;

&lt;p&gt;HTTP runs on &lt;strong&gt;TCP&lt;/strong&gt;, usually port &lt;strong&gt;80&lt;/strong&gt;. Each request is often a short conversation: connect, ask, answer, done. HTTP/1.1 can reuse one TCP connection for several requests.&lt;/p&gt;

&lt;p&gt;Example shape (not full syntax):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;GET&lt;/span&gt; &lt;span class="nn"&gt;/students/345&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server returns HTML or JSON. Plain HTTP is &lt;strong&gt;not encrypted&lt;/strong&gt;. Anyone on the path can read usernames, passwords, and cookies.&lt;/p&gt;




&lt;h2&gt;
  
  
  HTTPS: HTTP with TLS
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; is HTTP wrapped in &lt;strong&gt;TLS&lt;/strong&gt; (Transport Layer Security). TLS encrypts traffic &lt;strong&gt;above&lt;/strong&gt; TCP and &lt;strong&gt;below&lt;/strong&gt; HTTP.&lt;/p&gt;

&lt;p&gt;Older docs say &lt;strong&gt;SSL&lt;/strong&gt;; today we say &lt;strong&gt;TLS&lt;/strong&gt; (TLS 1.2 and 1.3 are common).&lt;/p&gt;

&lt;p&gt;What TLS gives you on port &lt;strong&gt;443&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Encryption&lt;/strong&gt; — outsiders cannot read the body or headers in transit
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrity&lt;/strong&gt; — tampering is detected
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication of the server&lt;/strong&gt; — the certificate proves you reached the real host (when the chain of trust is valid)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flow in words: TCP handshake first, then &lt;strong&gt;TLS handshake&lt;/strong&gt; (cipher choice, certificates, keys), then &lt;strong&gt;HTTP&lt;/strong&gt; inside the encrypted tunnel.&lt;/p&gt;

&lt;p&gt;Use HTTPS for anything with login forms, cookies, or personal data.&lt;/p&gt;




&lt;h2&gt;
  
  
  WebSocket
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WebSocket&lt;/strong&gt; is for &lt;strong&gt;long-lived, two-way&lt;/strong&gt; communication: chat, live dashboards, multiplayer games.&lt;/p&gt;

&lt;p&gt;It does not replace TCP. The usual path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with a normal &lt;strong&gt;HTTP&lt;/strong&gt; or &lt;strong&gt;HTTPS&lt;/strong&gt; request.
&lt;/li&gt;
&lt;li&gt;The client sends an &lt;strong&gt;Upgrade&lt;/strong&gt; header asking to switch to WebSocket.
&lt;/li&gt;
&lt;li&gt;If the server agrees, the same TCP connection becomes a WebSocket.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ws://&lt;/strong&gt; — WebSocket over HTTP (unencrypted)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;wss://&lt;/strong&gt; — WebSocket over HTTPS (encrypted), same idea as HTTPS
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the upgrade, both sides can &lt;strong&gt;push&lt;/strong&gt; messages anytime without opening a new HTTP request for each message.&lt;/p&gt;




&lt;h2&gt;
  
  
  gRPC
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;gRPC&lt;/strong&gt; is an application RPC framework: the client calls a method on the server as if it were a local function. Payloads are often &lt;strong&gt;Protocol Buffers&lt;/strong&gt; (binary, compact), not JSON.&lt;/p&gt;

&lt;p&gt;On the wire, gRPC commonly uses &lt;strong&gt;HTTP/2&lt;/strong&gt; over &lt;strong&gt;TCP&lt;/strong&gt; (port &lt;strong&gt;443&lt;/strong&gt; in production, often with TLS). It fits service-to-service calls inside a backend, not human-facing web pages.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Typical use&lt;/th&gt;
&lt;th&gt;Transport&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTTP/HTTPS&lt;/td&gt;
&lt;td&gt;Browsers, REST APIs&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WebSocket / WSS&lt;/td&gt;
&lt;td&gt;Chat, live updates&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC&lt;/td&gt;
&lt;td&gt;Microservices, internal APIs&lt;/td&gt;
&lt;td&gt;TCP (HTTP/2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;DNS, streaming, gaming&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Register and login architecture
&lt;/h2&gt;

&lt;p&gt;Two boxes: &lt;strong&gt;client&lt;/strong&gt; and &lt;strong&gt;server&lt;/strong&gt;. The password never travels in plain HTTP, and the database never stores the raw password.&lt;/p&gt;

&lt;h3&gt;
  
  
  Register
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client                                              server
   |---- HTTPS: username + password ---------------&amp;gt;|
   |                    hash password on server      |
   |                    store hash in database       |
   |&amp;lt;---------------- success / error --------------|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Register using HTTPS only&lt;/strong&gt; — TLS keeps the password from being read on the network.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On the server, hash the password and store it in the database&lt;/strong&gt; — save the hash, not the password string the user typed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Login
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;client                                              server
   |---- HTTPS: username + password ---------------&amp;gt;|
   |                    hash the password string     |
   |                    compare with hash in db      |
   |&amp;lt;---- success if match, failed if not ----------|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Login using HTTPS only&lt;/strong&gt; — same protection as registration.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On the server, hash the password string and check the database&lt;/strong&gt; — use the same hash function as at register time.
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If it matches, return success; otherwise return failed.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  A quick map to remember
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;TCP&lt;/strong&gt; — connect with SYN, SYN-ACK, ACK; reliable.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UDP&lt;/strong&gt; — send packets; no handshake; best effort.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP&lt;/strong&gt; — request/response on TCP; encrypt with &lt;strong&gt;HTTPS (TLS)&lt;/strong&gt; for secrets.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket&lt;/strong&gt; — upgrade HTTP(S) to ws(s) for two-way streams.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gRPC&lt;/strong&gt; — RPC over HTTP/2 and TCP, often with TLS.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passwords&lt;/strong&gt; — HTTPS for register and login; hash on the server; store and compare hashes in the database.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>networking</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>How to optimize a database, one step at a time</title>
      <dc:creator>Tarang</dc:creator>
      <pubDate>Sun, 27 Sep 2026 17:49:42 +0000</pubDate>
      <link>https://dev.to/tarangnagda/how-to-optimize-a-database-one-step-at-a-time-3842</link>
      <guid>https://dev.to/tarangnagda/how-to-optimize-a-database-one-step-at-a-time-3842</guid>
      <description>&lt;h2&gt;
  
  
  How to optimize a database, one step at a time
&lt;/h2&gt;

&lt;p&gt;A database gets slow for a few different reasons. The fix depends on which reason you have. Work through the steps in this order. The early steps are cheap. The later steps change how the system is built.&lt;/p&gt;

&lt;p&gt;Use one example the whole way: a &lt;code&gt;students&lt;/code&gt; table with ids from 1 to 1000.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Query optimization
&lt;/h2&gt;

&lt;p&gt;Ask the database only for what you need.&lt;/p&gt;

&lt;p&gt;If the screen shows a student's name, this is more than you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;345&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;*&lt;/code&gt; means every column: address, photo, notes, and columns you will not display. That extra data still has to be read and sent over the network.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;student_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;345&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same row. Smaller answer.&lt;/p&gt;

&lt;p&gt;This does not make a huge table fast by itself. It removes waste. Do it before you add hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Indexing
&lt;/h2&gt;

&lt;p&gt;An index is the index at the back of a book. You do not read every page to find "replication". You look up the word and jump to the page.&lt;/p&gt;

&lt;p&gt;Databases store many indexes as a &lt;strong&gt;B-tree&lt;/strong&gt;. The tree groups ids into ranges, so a lookup walks a few branches instead of scanning every row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 students (1–1000)
                 /                \
            1–500                501–1000
           /     \               /       \
       1–250   251–500       501–750   751–1000
                  ^
                  student 345 lives here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To find student 345, the database does not open all 1000 rows. It goes left (1–500), then right (251–500), then reads that block.&lt;/p&gt;

&lt;p&gt;Create an index on the column you search by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;students_id_idx&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An index speeds up reads. It costs a little on every insert and update, because the tree must stay in order. Index the columns in your &lt;code&gt;WHERE&lt;/code&gt; and &lt;code&gt;JOIN&lt;/code&gt; clauses, not every column.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Vertical scaling
&lt;/h2&gt;

&lt;p&gt;Vertical scaling means a bigger machine: more memory, more CPU, a faster disk.&lt;/p&gt;

&lt;p&gt;It works until the next size up is too expensive, or until one machine cannot take any more. A single server still has one ceiling. When you hit it, adding RAM again does not split the work.&lt;/p&gt;

&lt;p&gt;Use this while one machine is still comfortable. Move on when it is not.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Read replicas
&lt;/h2&gt;

&lt;p&gt;Reads and writes do not have to hit the same machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MySQL&lt;/strong&gt; is the database people usually mean with this picture. One server is the &lt;strong&gt;source&lt;/strong&gt; (older docs say &lt;em&gt;master&lt;/em&gt;). It is the only server that takes &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, and &lt;code&gt;DELETE&lt;/code&gt;. One or more &lt;strong&gt;replicas&lt;/strong&gt; (older docs say &lt;em&gt;slaves&lt;/em&gt;) receive a copy of those changes and serve &lt;code&gt;SELECT&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; does the same job with different names: a &lt;strong&gt;primary&lt;/strong&gt; and &lt;strong&gt;streaming replicas&lt;/strong&gt; (hot standbys). Amazon RDS, for both MySQL and PostgreSQL, calls the copies &lt;strong&gt;read replicas&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 +--&amp;gt;  source / primary     (writes)
client  ---------+--&amp;gt;  replica              (reads)
                 +--&amp;gt;  replica              (reads)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replication keeps the copies in sync. The primary writes a change to its log. Each replica applies that log. There is a short delay, called &lt;strong&gt;replication lag&lt;/strong&gt;. A read right after a write can still see the old row if it lands on a replica that has not caught up.&lt;/p&gt;

&lt;p&gt;Replicas take &lt;strong&gt;read&lt;/strong&gt; load off the primary. They do not take write load. Every write still goes to one machine.&lt;/p&gt;

&lt;p&gt;If the primary dies, a replica can be &lt;strong&gt;promoted&lt;/strong&gt; to primary so the system can keep going. That is a failover, not something that happens by itself in every setup. Promote a replica only after you know how far behind it was, or you can lose the last few writes.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Partitioning
&lt;/h2&gt;

&lt;p&gt;Partitioning splits &lt;strong&gt;one table inside one database&lt;/strong&gt;. The database still lives on one server. The rows are stored in separate pieces.&lt;/p&gt;

&lt;p&gt;Split &lt;code&gt;students&lt;/code&gt; by section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        +------------------+
        |  students        |
        |  section A       |
        |  section B       |
        |  section C       |
        +------------------+
           one database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A query for section B can skip A and C. A backup or a restore can target one section instead of the whole table. That is the "faster recovery" part: you move a piece, not the entire database.&lt;/p&gt;

&lt;p&gt;The database picks the partition from the partition key (&lt;code&gt;section&lt;/code&gt;). You still write normal SQL. The server is still one server.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Sharding
&lt;/h2&gt;

&lt;p&gt;Sharding is the same split, moved onto &lt;strong&gt;different servers&lt;/strong&gt;. Each server holds only its piece of the data.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   +-------------+          +-------------+          +-------------+
   | section A   |          | section B   |          | section C   |
   +-------------+          +-------------+          +-------------+
     server 1                 server 2                 server 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Server 1 does not have section B. A query for a student in section C must be sent to server 3. Something in front of the servers — the application, or a proxy — has to know that rule. The column you use for the rule is the &lt;strong&gt;shard key&lt;/strong&gt;. Here the shard key is &lt;code&gt;section&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Replicas copy the &lt;strong&gt;whole&lt;/strong&gt; database so more machines can read it. Shards &lt;strong&gt;divide&lt;/strong&gt; the database so no one machine has to store all of it or take every write.&lt;/p&gt;

&lt;p&gt;Sharding is the last step because it is the most work to operate. A question that needs section A and section B now talks to two servers. A transaction that updates two sections is no longer a normal single-database transaction. Adding server 4 means moving some sections onto it.&lt;/p&gt;

&lt;p&gt;Do the earlier steps first. Shard when one database, even with indexes, a bigger machine, replicas, and partitions, cannot hold the data or the writes.&lt;/p&gt;




&lt;h2&gt;
  
  
  A short order to remember
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Ask for fewer columns.&lt;/li&gt;
&lt;li&gt;Index the columns you search.&lt;/li&gt;
&lt;li&gt;Give the machine more memory and CPU while that is still cheap.&lt;/li&gt;
&lt;li&gt;Send reads to replicas. Keep writes on the primary. MySQL and PostgreSQL both do this.&lt;/li&gt;
&lt;li&gt;Partition a large table inside one database.&lt;/li&gt;
&lt;li&gt;Shard across servers only when one database is no longer enough.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>beginners</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Snake and Ladder in Go</title>
      <dc:creator>Tarang</dc:creator>
      <pubDate>Sat, 19 Sep 2026 17:52:33 +0000</pubDate>
      <link>https://dev.to/tarangnagda/snake-and-ladder-in-go-1d9p</link>
      <guid>https://dev.to/tarangnagda/snake-and-ladder-in-go-1d9p</guid>
      <description>&lt;h2&gt;
  
  
  Snake and Ladder in Go
&lt;/h2&gt;

&lt;p&gt;This is a small console Snake and Ladder game in Go. Use it to see how a program can be split into a few types that each do one thing.&lt;/p&gt;

&lt;p&gt;The board has 100 squares, plus snakes and ladders. Three coins take turns. A coin wins only when it lands on &lt;strong&gt;exactly 100&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;roll dice → move → if over 100, stay
         → apply snake/ladder (can chain)
         → if 100, that coin wins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgil7p7g4rdfz9cf96u1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgil7p7g4rdfz9cf96u1y.png" alt="Class diagram of Snake and Ladder in Go: Game uses Board, Coin, and Dice; Board holds Squares, Ladders, and Snakes; Ladder and Snake implement the Jumps interface" width="800" height="867"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Solid arrow = has / uses. Dashed arrow = implements.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the diagram this way: &lt;code&gt;Game&lt;/code&gt; is the teacher of the rules. &lt;code&gt;Board&lt;/code&gt; is the map. &lt;code&gt;main&lt;/code&gt; only builds the pieces, then asks &lt;code&gt;Game&lt;/code&gt; to &lt;code&gt;Play()&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design ideas to notice
&lt;/h2&gt;

&lt;p&gt;Keep these in mind as you read the types below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Idea&lt;/th&gt;
&lt;th&gt;What it means here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Facade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Callers should not wire dice, coins, and jumps themselves. They talk to &lt;code&gt;Game&lt;/code&gt; (&lt;code&gt;NewGame&lt;/code&gt;, &lt;code&gt;Play&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polymorphism&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A snake and a ladder are different. After a move, the rule is the same: if you are on a start, go to the end. That is why both implement &lt;code&gt;Jumps&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Constructors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prefer &lt;code&gt;NewBoard&lt;/code&gt;, &lt;code&gt;NewDice&lt;/code&gt;, &lt;code&gt;NewCoin&lt;/code&gt;, &lt;code&gt;NewLadder&lt;/code&gt;, &lt;code&gt;NewSnake&lt;/code&gt; so creation stays in one place.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;One job per type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Board stores the layout. Game runs the turns. Dice rolls. Coin is a token.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open for a new jump&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;applyJumps&lt;/code&gt; should not say &lt;code&gt;if snake&lt;/code&gt; / &lt;code&gt;if ladder&lt;/code&gt;. A new jump type can implement the same interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depend on the interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The turn loop should know &lt;code&gt;start()&lt;/code&gt; and &lt;code&gt;end()&lt;/code&gt;, not the names Snake and Ladder.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The types
&lt;/h2&gt;

&lt;p&gt;Walk through each type in order. Notice what it owns, and what it refuses to own.&lt;/p&gt;

&lt;h3&gt;
  
  
  Square
&lt;/h3&gt;

&lt;p&gt;A square is a number on the board.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;SquareNumber&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewSquare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squareNumber&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;squareNumber&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dice
&lt;/h3&gt;

&lt;p&gt;The die only rolls. It does not know whose turn it is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Dice&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Sides&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewDice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Dice&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Dice&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Sides&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Dice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;RollDice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Coin
&lt;/h3&gt;

&lt;p&gt;A coin is a player token: a color and a position. It does not know the rules of the game.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Coin&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;CurrentPosition&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="n"&gt;Color&lt;/span&gt;           &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewCoin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Coin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Jump interface, Ladder, Snake
&lt;/h3&gt;

&lt;p&gt;Keep snake and ladder as &lt;strong&gt;two structs&lt;/strong&gt;. They mean different things. Give them a shared interface only so the game can move a coin without caring which one it hit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Jumps&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Ladder&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="n"&gt;End&lt;/span&gt;   &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewLadder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startSquare&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endSquare&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;startSquare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;endSquare&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;End&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Snake&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="n"&gt;End&lt;/span&gt;   &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewSnake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startSquare&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;endSquare&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;startSquare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;endSquare&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;End&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Board
&lt;/h3&gt;

&lt;p&gt;The board knows the squares, the snakes, the ladders, and one combined list of jumps. It does not play.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Board&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Squares&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="n"&gt;Ladders&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;
    &lt;span class="n"&gt;Snakes&lt;/span&gt;  &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;
    &lt;span class="n"&gt;Jumps&lt;/span&gt;   &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Jumps&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewBoard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ladders&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snakes&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Board&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Board&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Squares&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Ladders&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ladders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Snakes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;snakes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Jumps&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;allJumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ladders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snakes&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;allJumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ladders&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ladder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snakes&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Snake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Jumps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;jumps&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;Jumps&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ladder&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;ladders&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;jumps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jumps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ladder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snake&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;snakes&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;jumps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jumps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snake&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jumps&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Game
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Game&lt;/code&gt; is the place for rules: whose turn, when to stop, when a coin has won.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Game&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Board&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Board&lt;/span&gt;
    &lt;span class="n"&gt;Coins&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Coin&lt;/span&gt;
    &lt;span class="n"&gt;Dice&lt;/span&gt;  &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Dice&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewGame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="n"&gt;Board&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;coins&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Game&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Game&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;coins&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NewDice&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Play()&lt;/code&gt; is the lesson you should read in the full source: turns, the exact-100 rule, and chained jumps. Watch the pointers. If a coin reuses the ladder’s own &lt;code&gt;Square&lt;/code&gt;, the next roll can change the board itself.&lt;/p&gt;

&lt;p&gt;That code is on GitHub. Clone the repo, run &lt;code&gt;go run .&lt;/code&gt;, and follow one coin until someone reaches 100.&lt;/p&gt;




&lt;h2&gt;
  
  
  Entire code on GitHub
&lt;/h2&gt;

&lt;p&gt;Full source — &lt;code&gt;Play()&lt;/code&gt;, &lt;code&gt;applyJumps()&lt;/code&gt;, &lt;code&gt;main&lt;/code&gt;, and a sample set of snakes and ladders:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/tarang21/snake-and-ladder" rel="noopener noreferrer"&gt;https://github.com/tarang21/snake-and-ladder&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>beginners</category>
      <category>lld</category>
    </item>
  </channel>
</rss>
