This commit is contained in:
krahets
2023-10-23 04:56:26 +08:00
parent 1ab075904f
commit f0d798173f
6 changed files with 23 additions and 6 deletions

View File

@ -3387,7 +3387,7 @@
<p>与许多语言不同的是,在 Python 中数字也被包装为对象,列表中存储的不是数字本身,而是对数字的引用。因此,我们会发现两个数组中的相同数字拥有同一个 id ,并且这些数字的内存地址是无须连续的。</p>
</div>
<div class="admonition question">
<p class="admonition-title">C++ STL 里面的 std::list 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?</p>
<p class="admonition-title">C++ STL 里面的 <code>std::list</code> 已经实现了双向链表,但好像一些算法的书上都不怎么直接用这个,是不是有什么局限性呢?</p>
<p>一方面,我们往往更青睐使用数组实现算法,而只有在必要时才使用链表,主要有两个原因。</p>
<ul>
<li>空间开销:由于每个元素需要两个额外的指针(一个用于前一个元素,一个用于后一个元素),所以 <code>std::list</code> 通常比 <code>std::vector</code> 更占用空间。</li>
@ -3395,6 +3395,14 @@
</ul>
<p>另一方面,必要使用链表的情况主要是二叉树和图。栈和队列往往会使用编程语言提供的 <code>stack</code><code>queue</code> ,而非链表。</p>
</div>
<div class="admonition question">
<p class="admonition-title">初始化列表 <code>res = [0] * self.size()</code> 操作,会导致 <code>res</code> 的每个元素引用相同的地址吗?</p>
<p>不会。但二维数组会有这个问题,例如初始化二维列表 <code>res = [[0] * self.size()]</code> ,则多次引用了同一个列表 <code>[0]</code></p>
</div>
<div class="admonition question">
<p class="admonition-title">在删除节点中,需要断开该节点与其后继节点之间的引用指向吗?</p>
<p>从数据结构与算法(做题)的角度看,不断开没有关系,只要保证程序的逻辑是正确的就行。从标准库的角度看,断开更加安全、逻辑更加清晰。如果不断开,假设被删除节点未被正常回收,那么它也会影响后继节点的内存回收。</p>
</div>
<!-- Source file information -->