This commit is contained in:
krahets
2023-08-22 13:50:24 +08:00
parent 77b90cd19b
commit b70b7c9e75
67 changed files with 580 additions and 580 deletions

View File

@ -3526,9 +3526,9 @@
<p>「链表 linked list」是一种线性数据结构其中的每个元素都是一个节点对象各个节点通过“引用”相连接。引用记录了下一个节点的内存地址通过它可以从当前节点访问到下一个节点。</p>
<p>链表的设计使得各个节点可以被分散存储在内存各处,它们的内存地址是无须连续的。</p>
<p><img alt="链表定义与存储方式" src="../linked_list.assets/linkedlist_definition.png" /></p>
<p align="center">链表定义与存储方式 </p>
<p align="center"> 4-5 &nbsp; 链表定义与存储方式 </p>
<p>观察图,链表的组成单位是「节点 node」对象。每个节点都包含两项数据节点的“值”和指向下一节点的“引用”。</p>
<p>观察图 4-5 ,链表的组成单位是「节点 node」对象。每个节点都包含两项数据节点的“值”和指向下一节点的“引用”。</p>
<ul>
<li>链表的首个节点被称为“头节点”,最后一个节点被称为“尾节点”。</li>
<li>尾节点指向的是“空”,它在 Java, C++, Python 中分别被记为 <span class="arithmatex">\(\text{null}\)</span> , <span class="arithmatex">\(\text{nullptr}\)</span> , <span class="arithmatex">\(\text{None}\)</span></li>
@ -3873,10 +3873,10 @@
</div>
<p>数组整体是一个变量,比如数组 <code>nums</code> 包含元素 <code>nums[0]</code> , <code>nums[1]</code> 等,而链表是由多个独立的节点对象组成的。<strong>我们通常将头节点当作链表的代称</strong>,比如以上代码中的链表可被记做链表 <code>n0</code></p>
<h3 id="2">2. &nbsp; 插入节点<a class="headerlink" href="#2" title="Permanent link">&para;</a></h3>
<p>在链表中插入节点非常容易。如图所示,假设我们想在相邻的两个节点 <code>n0</code> , <code>n1</code> 之间插入一个新节点 <code>P</code> <strong>则只需要改变两个节点引用(指针)即可</strong>,时间复杂度为 <span class="arithmatex">\(O(1)\)</span></p>
<p>在链表中插入节点非常容易。如图 4-6 所示,假设我们想在相邻的两个节点 <code>n0</code> , <code>n1</code> 之间插入一个新节点 <code>P</code> <strong>则只需要改变两个节点引用(指针)即可</strong>,时间复杂度为 <span class="arithmatex">\(O(1)\)</span></p>
<p>相比之下,在数组中插入元素的时间复杂度为 <span class="arithmatex">\(O(n)\)</span> ,在大数据量下的效率较低。</p>
<p><img alt="链表插入节点示例" src="../linked_list.assets/linkedlist_insert_node.png" /></p>
<p align="center">链表插入节点示例 </p>
<p align="center"> 4-6 &nbsp; 链表插入节点示例 </p>
<div class="tabbed-set tabbed-alternate" data-tabs="3:12"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio" /><input id="__tabbed_3_2" name="__tabbed_3" type="radio" /><input id="__tabbed_3_3" name="__tabbed_3" type="radio" /><input id="__tabbed_3_4" name="__tabbed_3" type="radio" /><input id="__tabbed_3_5" name="__tabbed_3" type="radio" /><input id="__tabbed_3_6" name="__tabbed_3" type="radio" /><input id="__tabbed_3_7" name="__tabbed_3" type="radio" /><input id="__tabbed_3_8" name="__tabbed_3" type="radio" /><input id="__tabbed_3_9" name="__tabbed_3" type="radio" /><input id="__tabbed_3_10" name="__tabbed_3" type="radio" /><input id="__tabbed_3_11" name="__tabbed_3" type="radio" /><input id="__tabbed_3_12" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="__tabbed_3_1">Java</label><label for="__tabbed_3_2">C++</label><label for="__tabbed_3_3">Python</label><label for="__tabbed_3_4">Go</label><label for="__tabbed_3_5">JS</label><label for="__tabbed_3_6">TS</label><label for="__tabbed_3_7">C</label><label for="__tabbed_3_8">C#</label><label for="__tabbed_3_9">Swift</label><label for="__tabbed_3_10">Zig</label><label for="__tabbed_3_11">Dart</label><label for="__tabbed_3_12">Rust</label></div>
<div class="tabbed-content">
@ -3991,10 +3991,10 @@
</div>
</div>
<h3 id="3">3. &nbsp; 删除节点<a class="headerlink" href="#3" title="Permanent link">&para;</a></h3>
<p>图所示,在链表中删除节点也非常方便,<strong>只需改变一个节点的引用(指针)即可</strong></p>
<p>如图 4-7 所示,在链表中删除节点也非常方便,<strong>只需改变一个节点的引用(指针)即可</strong></p>
<p>请注意,尽管在删除操作完成后节点 <code>P</code> 仍然指向 <code>n1</code> ,但实际上遍历此链表已经无法访问到 <code>P</code> ,这意味着 <code>P</code> 已经不再属于该链表了。</p>
<p><img alt="链表删除节点" src="../linked_list.assets/linkedlist_remove_node.png" /></p>
<p align="center">链表删除节点 </p>
<p align="center"> 4-7 &nbsp; 链表删除节点 </p>
<div class="tabbed-set tabbed-alternate" data-tabs="4:12"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio" /><input id="__tabbed_4_2" name="__tabbed_4" type="radio" /><input id="__tabbed_4_3" name="__tabbed_4" type="radio" /><input id="__tabbed_4_4" name="__tabbed_4" type="radio" /><input id="__tabbed_4_5" name="__tabbed_4" type="radio" /><input id="__tabbed_4_6" name="__tabbed_4" type="radio" /><input id="__tabbed_4_7" name="__tabbed_4" type="radio" /><input id="__tabbed_4_8" name="__tabbed_4" type="radio" /><input id="__tabbed_4_9" name="__tabbed_4" type="radio" /><input id="__tabbed_4_10" name="__tabbed_4" type="radio" /><input id="__tabbed_4_11" name="__tabbed_4" type="radio" /><input id="__tabbed_4_12" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="__tabbed_4_1">Java</label><label for="__tabbed_4_2">C++</label><label for="__tabbed_4_3">Python</label><label for="__tabbed_4_4">Go</label><label for="__tabbed_4_5">JS</label><label for="__tabbed_4_6">TS</label><label for="__tabbed_4_7">C</label><label for="__tabbed_4_8">C#</label><label for="__tabbed_4_9">Swift</label><label for="__tabbed_4_10">Zig</label><label for="__tabbed_4_11">Dart</label><label for="__tabbed_4_12">Rust</label></div>
<div class="tabbed-content">
@ -4478,8 +4478,8 @@
</div>
</div>
<h2 id="422-vs">4.2.2 &nbsp; 数组 VS 链表<a class="headerlink" href="#422-vs" title="Permanent link">&para;</a></h2>
<p>表总结对比了数组和链表的各项特点与操作效率。由于它们采用两种相反的存储策略,因此各种性质和操作效率也呈现对立的特点。</p>
<p align="center">数组与链表的效率对比 </p>
<p> 4-1 总结对比了数组和链表的各项特点与操作效率。由于它们采用两种相反的存储策略,因此各种性质和操作效率也呈现对立的特点。</p>
<p align="center"> 4-1 &nbsp; 数组与链表的效率对比 </p>
<div class="center-table">
<table>
@ -4530,7 +4530,7 @@
</table>
</div>
<h2 id="423">4.2.3 &nbsp; 常见链表类型<a class="headerlink" href="#423" title="Permanent link">&para;</a></h2>
<p>图所示,常见的链表类型包括三种。</p>
<p>如图 4-8 所示,常见的链表类型包括三种。</p>
<ul>
<li><strong>单向链表</strong>:即上述介绍的普通链表。单向链表的节点包含值和指向下一节点的引用两项数据。我们将首个节点称为头节点,将最后一个节点成为尾节点,尾节点指向空 <span class="arithmatex">\(\text{None}\)</span></li>
<li><strong>环形链表</strong>:如果我们令单向链表的尾节点指向头节点(即首尾相接),则得到一个环形链表。在环形链表中,任意节点都可以视作头节点。</li>
@ -4714,7 +4714,7 @@
</div>
</div>
<p><img alt="常见链表种类" src="../linked_list.assets/linkedlist_common_types.png" /></p>
<p align="center">常见链表种类 </p>
<p align="center"> 4-8 &nbsp; 常见链表种类 </p>
<h2 id="424">4.2.4 &nbsp; 链表典型应用<a class="headerlink" href="#424" title="Permanent link">&para;</a></h2>
<p>单向链表通常用于实现栈、队列、哈希表和图等数据结构。</p>