Python 从双链接列表中间删除元素时获得错误结果

Python 从双链接列表中间删除元素时获得错误结果,python,python-3.x,doubly-linked-list,Python,Python 3.x,Doubly Linked List,双链接列表的代码:(主要关注delete\u from\u list函数的最后一个else部分。) delete函数删除elem的特定节点,并返回更新链接列表的head和tail指针 尝试运行时: list_head, list_tail = delete_from_list(list_head, list_tail, 12) 通过输入:1356772124809,我得到最后一个else部分(在delete函数中)的print语句的输出,即412 print语句的输出是否应该不是2 12,因为

双链接列表的代码:(主要关注delete\u from\u list函数的最后一个else部分。)

delete函数删除
elem
的特定节点,并返回更新链接列表的
head
tail
指针

尝试运行时:

list_head, list_tail = delete_from_list(list_head, list_tail, 12)
通过输入:
1356772124809
,我得到最后一个
else
部分(在delete函数中)的print语句的输出,即
412
print语句的输出是否应该不是
2 12
,因为curr.next.prev现在指向2

删除后,如果我现在尝试使用以下代码遍历列表:

list_head = traverse_list_forward(list_head)
list_tail = traverse_list_backward(list_tail)
我得到这个奇怪的输出:

1 3 5 6 7 2 12
9 0 8 4 12
头指针和尾指针正确地指向它们的位置,但出现了一些混乱,这显示在遍历结果中

为什么选择这一行:

        curr.prev = curr.next.prev
        curr.next = curr.prev.next
工作不正常吗?我是不是遗漏了什么

另外,我也在用Jupyter笔记本

尝试删除输入的
12
后的输出
1 3 5 6 7 2 12 4 8 0 9
:如图所示


内,如果在此处执行
块,则从函数返回,阻止函数内的任何其他代码运行:

    if head.data == elem:     # Delete first element 
        if head == tail:
            head = tail = None
            return -1, -1

        curr = head
        head = head.next
        head.prev = None
        curr = None
        return head, tail
由于您的列表以
12
开头,并且您正在删除
12
,因此它会将
12
作为头部的
.data
,将其删除,然后返回-不删除任何其他内容

注意:代码中有许多语句不起任何作用,比如为
curr
赋值并清除它。您可能希望使用一个好的IDE来清理代码,我建议您一次只执行一行代码,而不是一次运行所有代码。另外,与其每次运行都手动输入,为什么不在代码中用一点简单的测试数据替换
input()
语句,这样可以更快地运行和重新运行

第二个问题是:

        curr.prev = curr.next.prev
        curr.next = curr.prev.next
如果您正在删除
12
,并且您的列表中包含此
。-2-12-4-…
,因此它试图从
2
4
之间删除
curr
12
,结果是:
curr.prev=curr.next.prev
.prev
指向
curr.next
prev
,即
4
prev
,这是<代码>12。因此,
12的
prev
现在指向它自己

你可能想要这样的东西:

        curr.prev.next = curr.next
        curr.next.prev = curr.prev
2.下一个
指向
4
4.上一个
指向
2

得到错误

基本上,这两条可疑线路应该是:

        curr.prev.next = curr.next
        curr.next.prev = curr.prev

删除函数只删除第一次出现的
元素
,并返回更新后的
列表的头
指针,而不是当前代码中的行。

@ggorlen不小心粘贴了两次代码,现在编辑了它。对不起。您现在可以查看了。请提供如何调用代码的示例代码和数据-您提供的示例非常广泛,但不包括任何要运行以重现问题的内容。@Grismar,首先我使用
list\u head,list\u tail=create\u list()
在运行时使用值
12 13 5 6 7 2 12 4 8 0 9 12
创建整数列表。然后我使用
list\u head=traveling\u list\u forward(list\u head)
list\u tail=traveling\u list\u backward(list\u tail)
在前进和后退方向进行遍历。这也行。使用时:
list\u head,list\u tail=delete\u from\u list(list\u head,list\u tail,12)
从head和tail(在fst 2调用中)删除
12
效果很好,但在第三次调用中,它无法从中间删除12个,遍历时我的列表值给出了错误的值,然后输入序列出现了问题:
1 3 5 6 7 2 12 4 8 0 9
尝试从此处删除
12
。。我们刚刚添加了图像。从开头和结尾删除代码似乎可以很好地工作。我添加了一些解释来解决这个问题,但正如我之前所说的,您应该使用一个像样的IDE,删除多余的代码,然后一行一行地遍历代码,问题就显而易见了。这正是我正在做的,只需要几秒钟就可以找到问题。顺便说一下,我只是在解决你所问的问题-我认为你的代码中有很多东西需要改进,但我很感激你在学习,所以不要追求完美。我只是一个数据结构的初学者,试图理解它们的工作原理。你的建议真的很有帮助。将消除代码中的冗余部分和逻辑,并使用更好的IDE。如果您觉得我的答案回答了您的问题,请接受它作为您问题的答案。如果你还有其他直接相关的问题,请随意提问,但如果它们确实是不同的问题,你最好开始一个新的更具体的问题。
        curr.prev.next = curr.next
        curr.next.prev = curr.prev