我试图了解链表的工作方式

时间:2019-04-15 01:21:20

标签: python

尝试通过codesignal的链表教程进行工作,但无法理解以下代码。我确实了解到每一行的作用,但没有得到为什么我们tmp = ll分配给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

我们非常感谢您的帮助。

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保留,未被检查。

因此它检查末尾的头(第一个节点)。