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