'Node' 对象没有属性 'set_next'

'Node' object has no attribute 'set_next'

当我插入一个新节点时,我得到 AttributeError:'Node' 对象没有属性 'set_next'。我真的不明白为什么,因为在我的节点 class 中我有一个方法 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

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

这将修复 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

按照你现在的缩进,

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'

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

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

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