Как я могу инициализировать узел связанного списка одним вызовом инициализации? - PullRequest
2 голосов
/ 27 мая 2019

Я пытаюсь создать связанный список в Python. Мой вопрос в функции инициализации приведенного ниже кода

class Node(object):

    def __init__(self, data=None, next_node=None):
        self.data = data
        self.next_node = next_node

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next_node

    def set_next(self, new_next):
        self.next_node = new_next


firstNode = Node(15)

secondNode = Node(20)

thirdNode = Node(25)

firstNode.next_node = secondNode

Я хочу спросить, можем ли мы инициализировать узел (вместе с его данными и ссылкой на следующий узел) в одном вызове инициализации?

В приведенном выше коде я сначала передаю атрибут данных узла в вызове init, а затем устанавливаю ссылку с помощью атрибута next_node. Есть ли способ сделать обе вещи в одном вызове инициализации?

Ответы [ 2 ]

2 голосов
/ 27 мая 2019

Да, этого можно достичь, вложив экземпляры классов.
Например, один вкладыш для установки всех трех узлов в одном вызове

thirdNode = Node(25, Node(20, Node(15)))
print(thirdNode.data)
print(thirdNode.next_node.data)
print(thirdNode.next_node.next_node.data)

Или разбиение кода в вызовах таким образом, чтобыnext_node вызывается в конструкторе при создании нового Node объекта

firstNode = Node(15)
secondNode = Node(20, firstNode)
thirdNode = Node(25, secondNode)
print(thirdNode.data)
print(secondNode.data)
print(firstNode.data)

Вывод будет

25
20
15
1 голос
/ 27 мая 2019

Я добавлю функциональную версию, используя reduce, сборка обратная, будучи 4 данными корневого узла (вы можете обратить данные):

from functools import reduce
ll =  reduce(lambda x, y: Node(y, x), (1, 2, 3, 4), Node(0))

Здесь у вас есть живой пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...