提问者:小点点

我混淆了Python中链表中的当前和current.next。我们什么时候应该使用它们?


在链表中,我为Node和LinkedList使用了这两个类。现在,当在链表中为不同的操作添加不同的方法时,我们需要使用while循环。我们通常使用(这里我们将当前分配给head电流=self. head),而当前:,而current.next:来迭代语句。我不明白这两个条件是如何不同的,以及它如何影响循环。这两个条件之间有什么区别吗?

    class Node(object):
    def __init__(self, value):
        self.value = value
        self.next = None

class LinkedList(object):
    def __init__(self, head = None):
        self.head = head


    #append function
    def append(self, data):
        current = self.head
        if self.head:
            while current.next:
                current= current.next
            current.next= data
        else:
            self.head = data


        #display function
    def show(self):
        current = self.head
        while current.next:
            print(current.value)
            current = current.next
            if not current.next:
                print(current.value)

         
             #insert
    def insert(self, new_element, position):
        counter = 1
        current = self.head
        if position > 1:
            while current and counter < position:
                if counter == position - 1:
                    new_element.next = current.next
                    current.next = new_element
                current = current.next
                counter += 1
        elif position == 1:
            new_element.next = self.head
            self.head = new_element

    

附加了两个方法的代码。一个使用而当前:,另一个使用而current.next:


共2个答案

匿名用户

它们的含义有所不同。这段代码使用了“真实”,即Python中的每个值都可以计算为TrueFalse。对于整数,0False,其他任何内容都是True。对于字符串,"False,其他任何内容都是True。类似地,对于对象引用(如当前current.next),False,其他任何内容都是True

因此,如果循环条件是,而当前:,这只是意味着"在当前不是时继续执行此操作",即只要当前指向链表中的一个项目。如果循环条件是,而current.next:,这意味着"在current.next不是时继续执行此操作",即只要链表中在当前之后有一个下一个项目。

请注意,while循环不关心条件的类型,它只是评估其真实性,并且仅在每次迭代开始时这样做。

匿名用户

有一个重要的区别

>

  • 当前:

    当您想潜在地处理循环中的所有节点,并且在循环完成后不需要仍然访问最后一个节点时,您可以使用此选项。循环完成后,当前将是

    而current.next:

    当你想找到列表中的最后一个节点时,这就是你使用的。循环完成后,当前将是最后一个节点。所以这个循环比另一个循环提前一步停止。但是有一个预防措施要采取:如果当前在循环开始时是,就会出现异常。所以只有当你已经确定当前不是时才使用这个。

    现在转到使用这些循环的实际代码:

    current = self.head
    if self.head:
        while current.next:
            current= current.next
        current.next= data
    

    这是第二种类型。循环的目的是找到列表中的最后一个节点。为了避免潜在的异常,循环由if self. head:保护。此时self.head正在引用与当前相同的节点,因此如果current.next:,它也可能是。循环后的语句有效地使用列表中的最后一个节点,以便链接它之后的新节点。如果您使用第一种类型的循环执行此操作,您将已经丢失了对最后一个节点的引用,并且当前将是,因此不可能仍然执行current.next=data

    show函数中,我们还看到了第二种类型的循环:

    current = self.head
    while current.next:
        print(current.value)
        current = current.next
        if not current.next:
            print(current.value)
    

    然而,这里它没有被正确使用。这里的目标不是找到最后一个节点,而是对每个节点做一些事情。此外,当列表为空时,这段代码会引发异常(即当self. head时)。它在循环内部使用if来掩盖这种类型的循环提前一步停止的事实,因此可以解决该“问题”并仍然覆盖丢失的步骤。

    简而言之,这是错误的循环类型!它应该这样编码:

    current = self.head
    while current:
        print(current.value)
        current = current.next
    
    while current and counter < position:
        if counter == position - 1:
            new_element.next = current.next
            current.next = new_element
        current = current.next
        counter += 1
    

    这里我们要迭代,直到找到给定位置之前的节点,然后在它之后插入新节点。这里没有兴趣在循环之后找到最后一个节点并对其做一些事情,所以这是正确的循环类型(第一种类型)。