双向链表删除中间节点返回值失败,请求技术排查
嘿,我看你在实现双向链表时碰到了麻烦——添加三个数字后删除索引1的节点,却没法返回正确的节点值对吧?从你贴出来的代码片段来看,目前只定义了链表和节点的初始化逻辑,删除节点的核心代码没放出来,不过我可以帮你梳理下常见的出错点,以及正确的删除逻辑该怎么写。
首先,先明确双向链表删除中间节点(非头、非尾的节点)的核心步骤,这几步要是错了很容易出问题:
- 准确找到对应索引的目标节点
- 提前保存目标节点的
val(这是你要返回的值,一定要先存好,别改完指针才想起拿) - 把目标节点的前驱节点的
next指向目标节点的后继节点 - 把目标节点的后继节点的
prev指向目标节点的前驱节点 - 断开目标节点的
next和prev引用(避免内存里的残留引用,虽然Python有GC,但这是良好习惯) - 返回刚才保存的
val
接下来给你列几个最容易踩的坑,你可以对照自己的代码排查:
索引定位错误
你的链表用了哨兵头节点(__header是值为None的空节点),所以真正的第一个数据节点是__header.next。如果你的遍历逻辑是从__header开始计数,那索引1对应的就不是第二个数据节点了,一定要从__header.next开始,从0开始计数。没提前保存节点值
要是你先修改了前驱/后继的指针,然后再去拿目标节点的val,万一逻辑里不小心把目标节点的引用丢了,就拿不到正确值了——一定要在修改任何指针之前,把current.val存到变量里。指针修改不完整
很多人会忘了修改后继节点的prev,只改了前驱的next,这样链表的双向关联就断了,不仅可能导致后续操作出错,也可能让目标节点的引用没被正确释放,间接影响返回值的逻辑。边界情况处理遗漏
虽然你是删中间节点,但如果你的删除方法是通用的,要确保在找节点时判断current是否为None(比如索引超出链表长度的情况),避免出现AttributeError。
最后给你一个参考的删除方法实现,你可以对比自己的代码看看差异:
def delete_at_index(self, index): # 先处理无效索引 if index < 0: raise IndexError("Index cannot be negative") current = self.__header.next count = 0 # 遍历找到目标节点 while current is not None and count < index: current = current.next count += 1 if current is None: raise IndexError("Index out of range") # 提前保存要返回的值 deleted_val = current.val # 修改前驱节点的next current.prev.next = current.next # 如果不是最后一个节点,修改后继节点的prev if current.next is not None: current.next.prev = current.prev # 断开当前节点的引用 current.next = None current.prev = None return deleted_val
你可以先检查自己的删除方法是不是在上述某一步出了问题,要是还有疑问,可以把完整的删除代码贴出来,我再帮你细查~
内容的提问来源于stack exchange,提问作者user8722329

