Объект 'Node' не имеет атрибута 'set_next' - PullRequest
0 голосов
/ 12 июня 2019

Когда я вставляю новый узел, я получаю 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 ]

2 голосов
/ 12 июня 2019

Это исправит 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 голос
/ 12 июня 2019

Я попробовал это и надеюсь, что это поможет вам:

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
1 голос
/ 12 июня 2019

С отступом, как он есть,

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.

...