“节点”对象没有属性“ set_next”

时间:2019-06-12 11:49:15

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

当我插入一个新节点时,我得到AttributeError:'Node'对象没有属性'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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

按照您的缩进顺序显示,

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__方法的本地功能。

因此,如错误所示,是“ Node class does not have a set_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

答案 2 :(得分:1)

我尝试过此方法,希望对您有所帮助:

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