在链表中,我为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:
它们的含义有所不同。这段代码使用了“真实”,即Python中的每个值都可以计算为True
或False
。对于整数,0
是False
,其他任何内容都是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
这里我们要迭代,直到找到给定位置之前的节点,然后在它之后插入新节点。这里没有兴趣在循环之后找到最后一个节点并对其做一些事情,所以这是正确的循环类型(第一种类型)。