我对Python中链表中的current和current.next感到困惑。我们什么时候应该使用它们?

问题描述 投票:0回答:3

在链表中,我使用了 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 linked-list
3个回答
0
投票

它们的含义不同。这段代码使用了“真实性”,即 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
循环并不关心条件的类型,它只是评估其真实性,并且仅在每次迭代开始时这样做。


0
投票

有一个重要的区别

  1. while current:

    当您想要处理循环中的所有节点,并且在循环结束后不需要仍然访问最后一个节点时,您可以使用此方法。循环结束后,

    current
    将变为
    None

  2. 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.headNone

 时),此代码将引发异常。它在循环内使用 
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:

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.