尝试通过codesignal的链表教程进行工作,但无法理解以下代码。我确实了解到每一行的作用,但没有得到为什么我们tmp = l
将l
分配给tmp
并最后检查l
的原因。
# Definition for singly-linked list:
# class ListNode(object):
# def __init__(self, x):
# self.value = x
# self.next = None
#
def removeKFromList(l, k):
tmp = l
while tmp:
if tmp.next and tmp.next.value == k:
tmp.next = tmp.next.next
else:
tmp = tmp.next
if l and l.value == k:
return l.next
else:
return l
其中l
是一个链表
l = [3, 1, 2, 3, 4, 5]
k = 3
我们非常感谢您的帮助。
答案 0 :(得分:0)
最后,您检查l
,因为while循环从不检查链接列表中的第一个元素是否是您应该删除的元素。在您提供的示例数据中,如果没有该支票,则不会删除这3个。
tmp = l
可以为l
制作“副本”,以便它可以遍历列表中的每个元素而不会忘记第一个元素是什么。这与检查末尾有关,因为如果直接在l
上运行while循环,则将无法再检查第一个元素。
答案 1 :(得分:0)
这里要理解的关键是将一个指向对象的变量分配给另一个变量,从而为您提供引用的副本,而不是对象。因此,如果a
是对象类型MyClass
的实例,那么进行b = a
不会创建a
的副本,而是使之{{1 }}和a
现在指向同一对象。
在示例代码中,b
导致tmp = l
指向tmp
指向的对象。 l
然后用于遍历列表并进行所需的更改,从而修改tmp
指向的对象(列表的头节点)以及随后的节点,而{{ 1}}一直指向头节点。
尽管这不是一个很好的代码,但鉴于Python中的命名约定和内置功能,命名却令人困惑。但我知道那不是你的错。
答案 2 :(得分:0)
它使用2个检查来滤除元素k
-删除任何值为k
的节点。
第一次使用tmp
遍历列表以使用以下方法取消链接具有tmp.value == k
的任何节点(第一个节点除外 )
tmp.next = tmp.next.next # tmp.next is not in the list then
此时,您的第一个节点仍由l
保留,未被检查。
因此它检查末尾的头(第一个节点)。