在链表中,我使用了 Node 和 LinkedList 这两个类。现在当在链表中添加不同的方法进行不同的操作时,我们需要使用while循环。我们一般使用(这里我们将 current 赋值给 head current = self.head)
while current:
或 while 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
附上两种方法的代码。一个使用
while current:
,另一个使用 while current.next:
它们的含义不同。这段代码使用了“真实性”,即 Python 中的每个值都可以计算为
True
或 False
。对于整数,0
是 False
,其他任何值都是 True
。对于字符串,''
是 False
,其他任何内容都是 True
。同样,对于对象引用(如 current
或 current.next
),None
是 False
,其他任何内容都是 True
。
因此,如果循环条件是
while current:
,则意味着“当current
不是None
时继续执行此操作”,即只要current
指向链表中的某个项目。如果循环条件是while current.next:
,则意味着“当current.next
不是None
时继续执行此操作”,即只要链表中存在next
之后的current
项。
请注意,
while
循环并不关心条件的类型,它只是评估其真实性,并且仅在每次迭代开始时这样做。
有一个重要的区别
while current:
当您想要处理循环中的所有节点,并且在循环结束后不需要仍然访问最后一个节点时,您可以使用此方法。循环结束后,
current
将变为None
。
while current.next:
当您想要查找列表中的最后一个节点时,可以使用此方法。循环结束后,
current
将是最后一个节点。所以这个循环比另一循环早一步停止。但需要注意的是:如果在循环开始时 current
是
None
,则会出现异常。因此,仅当您已经确定
current
不是
None
时才使用此选项。
案例1
current = self.head
if self.head:
while current.next:
current= current.next
current.next= data
这是第二种。循环的目的是找到链表中的最后一个节点。为了避免潜在的异常,循环受到 if self.head:
的保护。此时
self.head
引用与
current
相同的节点,因此它也可能是
if current.next:
。语句after循环有效地使用列表中的最后一个节点来链接它后面的新节点。如果您使用第一种类型的循环来完成此操作,您将已经丢失对最后一个节点的引用,并且
current
将是
None
,从而无法继续执行
current.next = data
。案例2
show
函数中我们还看到了第二种类型的循环:
current = self.head
while current.next:
print(current.value)
current = current.next
if not current.next:
print(current.value)
但是,这里并没有正确使用。这里的目标不是找到最后一个节点,而是对每个节点做一些事情。此外,当列表为空时(即当 self.head
为 None
时),此代码将引发异常。它在循环内使用
if
来掩盖这种类型的循环提前一步停止的事实,因此可以解决该“问题”并仍然覆盖缺失的步骤。
简而言之,这是错误的循环类型!它应该是这样编码的:
current = self.head
while current:
print(current.value)
current = current.next
案例3
while current and counter < position:
if counter == position - 1:
new_element.next = current.next
current.next = new_element
current = current.next
counter += 1
last节点并在循环后对其执行某些操作,因此这是正确的循环类型(第一种类型)。
que hace esto , 而 curr 和 curr.data != key: