python链接列表首先删除

时间:2019-04-29 12:47:27

标签: python linked-list

好,所以我在玩链接列表。我真的不知道为什么它不起作用。有人可以解释为什么吗?

不用理会插入部分,让我们看一下removeFirst(更简单)。

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

class Link():
    def __init__(self):
        self.head = None

    def insertFirst(self, data_n):
        node = Node(data_n)
        head = self
        node.next = head.head
        head.head = node

    def display(self):
        head = self.head
        while head != None:
            print(head.data, end = '->')
            head = head.next
        print()

    def removeFirst(self):
        head = self.head
        head = head.next

以下代码无效。

def removeFirst(self):
    head = self.head
    head = head.next

但是,这个有效。

def removeFirst(self):
    #head = self.head
    self.head = self.head.next

有人可以帮我吗?

3 个答案:

答案 0 :(得分:1)

def removeFirst(self):
    head = self.head
    head = head.next

您创建一个局部变量head,该变量的值是self.head,然后是值head.next。 这就是这两行。

def removeFirst(self):
    self.head = self.head.next

您将self.head.next的值绑定到head的{​​{1}}属性中。所以现在self等于self.head


看起来您的困惑来自于以下事实:在其他常见的面向对象语言中,成员范围是整个类,例如,如果您在C#的self.head.next类中有一个head成员,或者Java,那么任何实例方法中的Link都将直接引用head

好吧,在Python中,事情并非如此,这就是为什么我们将this.head传递给实例方法的原因。 如果要对实例的成员执行操作,则必须在其前面加上self

答案 1 :(得分:0)

代码

head = self.head
head = head.next

首先创建对self.head当前引用的对象的新引用(我们称其为对象A)。然后,将head重新分配为指向A.next。结果是self.next完全不受影响,仍然指向A。与您提供的替代构造不同。

答案 2 :(得分:0)

第一个函数只是分配self.head的值,然后将head.next的值分配给head

def removeFirst(self):
    head = self.head
    head = head.next

相当于...

self.head = 1
head.next = 2
x = 1
x = 2

什么都不做

第二个函数实际上将元素放在head旁边,并将其设为新的head,旧的head被垃圾回收了!

def removeFirst(self):
    #head = self.head
    self.head = self.head.next

所以如果列表更早

self.head   self.head.next
 1 -----------> 2

列表更改为

self.head
2