【问题标题】:'Node' object has no attribute 'set_next'“节点”对象没有属性“set_next”
【发布时间】:2019-10-26 22:19:39
【问题描述】:

当我插入一个新节点时,我得到 AttributeError: 'Node' object has no attribute 'set_next'。我真的不明白为什么,因为在我的 Node 类中我有一个方法 set_next。那不是我打电话的那个人吗?

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

        def get_data(self):
            return self.val

        def set_data(self, val):
            self.val = val

        def get_next(self):
            return self.next

        def set_next(self, next):
            self.next = next

class LinkedList(object):
    def __init__(self, head=None):
        self.head = head
        self.count = 0 

    def get_count(self):
        return self.count

    def insert(self, data):
        new_node = Node(data)
        new_node.set_next()
        self.head = new_node
        self.count += 1

预期的输出是新节点应该是新的头节点。

【问题讨论】:

  • 在哪一行?你怎么称呼这个?而您的 set_next 方法需要一个您没有提供的参数。
  • 好像你的缩进关闭了,取消所有函数get_data, set_data ..的缩进,使它们与init处于同一级别
  • @doctorlove 我用itemList = LinkedList() 调用它,然后用itemList.insert(38) 插入一个新节点,运行new_node.set_next() 时def insert 方法出现错误。
  • 但是你的set_next 函数需要一个参数。
  • new_node.set_next(self.head) 例如。

标签: python python-3.x linked-list singly-linked-list


【解决方案1】:

这将修复AttributeError 和随后的TypeError

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

    # fixed indentation here
    def get_data(self):
        return self.val

    def set_data(self, val):
        self.val = val

    def get_next(self):
        return self.next

    def set_next(self, next):
        self.next = next

class LinkedList(object):
    def __init__(self, head=None):
        self.head = head
        self.count = 0 

    def get_count(self):
        return self.count

    def insert(self, data):
        new_node = Node(data)
        # fix logic here
        new_node.set_next(self.head)
        self.head = new_node
        self.count += 1

测试

linked_list = LinkedList()
linked_list.insert('hello')
linked_list.insert('world')
print(linked_list.count)
print(linked_list.head.val)
print(linked_list.head.next.val)

输出

2
world
hello

请注意,如您所见,此 LinkedList 仅插入到列表的前面,而不是末尾。


奖金

如果你想遍历列表,使用这个方法

def __iter__(self):
   node = self.head
   while node is not None:
       yield node.val
       node = node.next

【讨论】:

    【解决方案2】:

    就目前的缩进而言,

    class Node(object):
        def __init__(self, val):
            self.val = val
            self.next = None
    
            def get_data(self):
                return self.val
    

    get_data 和以下函数,包括 set_next__init__ 方法的本地函数。

    所以,正如错误所说,“Nodeclass does not have aset_next` 方法。

    你需要把它们拉回来:

    class Node(object):
        def __init__(self, val):
            self.val = val
            self.next = None
    
        def get_data(self):
            return self.val
    
        #... and the rest
    

    这会给您带来更多问题,但请解决您最初的问题。

    接下来,你会看到

    File "linked.py", line 28, in insert
      new_node.set_next()
      TypeError: set_next() missing 1 required positional argument: 'next'
    

    正如 cmets 中所说,您需要传递一个值。 我怀疑您正在尝试将头部或最终节点上的 next 设置为此 new_node

    【讨论】:

      【解决方案3】:

      我试过了,希望对你有帮助:

      class Node(object):
          def __init__(self, val):
              self.val = val
              self.next = None
          def get_data(self):
              return self.val
          def set_data(self, val):
              self.val = val
          def get_next(self):
              return self.next
          def set_next(self, next):
              self.next = next
      
      class LinkedList(object):
          def __init__(self, head=None):
              self.head = head
              self.count = 0 
          def get_count(self):
              return self.count
          def insert(self, data):
              new_node = Node(data)
              new_node.set_next(self.head)
              self.head = new_node
              self.count += 1
      >>> itemList = LinkedList()
      >>> itemList.insert(38)
      >>> itemList.insert(40)
      >>> itemList.get_count()
      2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-30
        • 2019-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        相关资源
        最近更新 更多