本文详解 Python 单向链表中按索引插入节点的核心逻辑,重点解决中间位置插入失败的问题——关键在于正确维护前驱节点的 _next 引用,而非错误地重赋 curr 变量。
本文详解 python 单向链表中按索引插入节点的核心逻辑,重点解决中间位置插入失败的问题——关键在于正确维护前驱节点的 `_next` 引用,而非错误地重赋 `curr` 变量。
在实现链表的 insert(i, value) 方法时,许多开发者会陷入一个典型误区:误将新节点赋值给局部变量 curr,而未真正修改链表结构。正如示例中尝试在索引 1 处插入 77(期望结果为 11 → 77 → 22 → 33),但输出仍为 11 → 22 → 33,根本原因在于以下错误代码:
curr = _List_Node(value, prev) # ❌ 错误:仅改变局部变量 curr,未更新链表指针
该语句创建了新节点,却将其链接到 prev(前驱节点本身),而非原 curr(当前节点),更严重的是——它没有更新 prev._next,导致新节点完全脱离链表。
✅ 正确做法是:在定位到插入位置的前驱节点 prev 后,将 prev._next 指向新节点,并让新节点的 _next 指向原 curr。修正后的 insert 方法如下:
def insert(self, i, value):
"""
A copy of value is added to index i, following values are pushed right.
If i outside of range of -len(list) to len(list) - 1, the value is
prepended or appended as appropriate.
"""
# 边界处理:索引超出右边界 → 追加
if i >= self._count:
self.append(value)
# 索引为负数或 0 → 前插
elif i <blockquote>
<p>? <strong>关键说明</strong>: </p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8054" title="python-parallelization"><img
src="https://img.php.cn/upload/skill/000/000/081/179181013081932.jpg" alt="python-parallelization" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8054" title="python-parallelization" class="overflowclass">python-parallelization</a>
<p class="overflowclass">将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8054" title="python-parallelization" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul>
<li>插入索引 i 表示新节点将成为列表中第 i 个元素(从 0 开始计数),因此需找到索引 i-1 处的节点作为 prev; </li>
<li>prev._next = new_node 是链表结构变更的唯一生效操作; </li>
<li>new_node._next = prev._next(构造时传入)确保后续节点不丢失。</li>
</ul>
</blockquote><p>此外,请补全 is_empty() 和 __len__() 方法以保证类完整性:</p><pre class="brush:php;toolbar:false;">def is_empty(self):
return self._front is None
def __len__(self):
return self._count⚠️ 注意事项:
- 不要依赖 curr._next is not None 作为循环终止条件(原代码中 while count != i and curr._next is not None),这会导致在 i == self._count-1 时提前退出,漏掉末尾前插入;应使用确定步数的 for 循环更安全;
- prepend 和 append 中存在冗余节点创建(如 prepend 中两次新建 _List_Node),建议统一为单次构造 + 指针调整;
- 所有节点值使用 deepcopy(value) 是合理的(支持复杂对象),但需确保已导入 from copy import deepcopy。
通过以上修正,执行以下测试代码即可得到预期结果:
LD = List() LD.append(11) LD.append(22) LD.append(33) LD.insert(1, 77) LD.printf() # 输出:11\n77\n22\n33
至此,链表按索引插入功能完整、健壮且符合线性数据结构语义。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










