【问题标题】:python link list remove at first [closed]python链表首先删除[关闭]
【发布时间】:2023-03-07 04:55:01
【问题描述】:

好的,所以我在玩链接列表。我真的不明白为什么它不起作用。谁能解释一下原因?

不用管insert部分,先看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

有人可以帮我解决这个问题吗?

【问题讨论】:

  • “我发现了这个”是否意味着你没有写这个?
  • 片段 1 覆盖局部变量 head,而不是成员变量 self.head
  • @Mugunth.. ooty ya?

标签: python linked-list


【解决方案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 的值绑定到selfhead 属性中。所以现在,self.head 等于 self.head.next


看起来你的困惑来自于在其他常见的面向对象语言中,成员范围是整个类,就像你在 C# 或 Java 中的 Link 类中有一个 head 成员,那么简单head 在任何实例方法中都是对this.head 的直接引用。

嗯,在 Python 中,事情不是这样工作的,这就是我们将 self 传递给实例方法的原因。 如果你想对实例的成员采取行动,你必须在他们前面加上self.

【讨论】:

    【解决方案2】:

    第一个函数只是将self.head的值赋值给head.next,然后将head的值赋值给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
    

    【讨论】:

    • 感谢接受@mugunth!祝你有美好的一天:)
    【解决方案3】:

    代码

    head = self.head
    head = head.next
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多