mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-14 02:10:37 +08:00
deploy
This commit is contained in:
@@ -3351,25 +3351,25 @@
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">为什么数组要求相同类型的元素,而在链表中却没有强调同类型呢?</p>
|
||||
<p>链表由结点组成,结点之间通过引用(指针)连接,各个结点可以存储不同类型的数据,例如 int、double、string、object 等。</p>
|
||||
<p>链表由节点组成,节点之间通过引用(指针)连接,各个节点可以存储不同类型的数据,例如 int、double、string、object 等。</p>
|
||||
<p>相对地,数组元素则必须是相同类型的,这样才能通过计算偏移量来获取对应元素位置。例如,如果数组同时包含 int 和 long 两种类型,单个元素分别占用 4 bytes 和 8 bytes ,那么此时就不能用以下公式计算偏移量了,因为数组中包含了两种长度的元素。</p>
|
||||
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># 元素内存地址 = 数组内存地址 + 元素长度 * 元素索引</span>
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">删除节点后,是否需要把 <code>P.next</code> 设为 <span class="arithmatex">\(\text{None}\)</span> 呢?</p>
|
||||
<p>不修改 <code>P.next</code> 也可以。从该链表的角度看,从头结点遍历到尾结点已经遇不到 <code>P</code> 了。这意味着结点 <code>P</code> 已经从链表中删除了,此时结点 <code>P</code> 指向哪里都不会对这条链表产生影响了。</p>
|
||||
<p>不修改 <code>P.next</code> 也可以。从该链表的角度看,从头节点遍历到尾节点已经遇不到 <code>P</code> 了。这意味着节点 <code>P</code> 已经从链表中删除了,此时节点 <code>P</code> 指向哪里都不会对这条链表产生影响了。</p>
|
||||
<p>从垃圾回收的角度看,对于 Java、Python、Go 等拥有自动垃圾回收的语言来说,节点 <code>P</code> 是否被回收取决于是否有仍存在指向它的引用,而不是 <code>P.next</code> 的值。在 C 和 C++ 等语言中,我们需要手动释放节点内存。</p>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">在链表中插入和删除操作的时间复杂度是 <span class="arithmatex">\(O(1)\)</span> 。但是增删之前都需要 <span class="arithmatex">\(O(n)\)</span> 查找元素,那为什么时间复杂度不是 <span class="arithmatex">\(O(n)\)</span> 呢?</p>
|
||||
<p>如果是先查找元素、再删除元素,确实是 <span class="arithmatex">\(O(n)\)</span> 。然而,链表的 <span class="arithmatex">\(O(1)\)</span> 增删的优势可以在其他应用上得到体现。例如,双向队列适合使用链表实现,我们维护一个指针变量始终指向头结点、尾结点,每次插入与删除操作都是 <span class="arithmatex">\(O(1)\)</span> 。</p>
|
||||
<p>如果是先查找元素、再删除元素,确实是 <span class="arithmatex">\(O(n)\)</span> 。然而,链表的 <span class="arithmatex">\(O(1)\)</span> 增删的优势可以在其他应用上得到体现。例如,双向队列适合使用链表实现,我们维护一个指针变量始终指向头节点、尾节点,每次插入与删除操作都是 <span class="arithmatex">\(O(1)\)</span> 。</p>
|
||||
</div>
|
||||
<div class="admonition question">
|
||||
<p class="admonition-title">图片“链表定义与存储方式”中,浅蓝色的存储结点指针是占用一块内存地址吗?还是和结点值各占一半呢?</p>
|
||||
<p class="admonition-title">图片“链表定义与存储方式”中,浅蓝色的存储节点指针是占用一块内存地址吗?还是和节点值各占一半呢?</p>
|
||||
<p>文中的示意图只是定性表示,定量表示需要根据具体情况进行分析。</p>
|
||||
<ul>
|
||||
<li>不同类型的结点值占用的空间是不同的,比如 int、long、double 和实例对象等。</li>
|
||||
<li>不同类型的节点值占用的空间是不同的,比如 int、long、double 和实例对象等。</li>
|
||||
<li>指针变量占用的内存空间大小根据所使用的操作系统及编译环境而定,大多为 8 字节或 4 字节。</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user