Я пытаюсь создать связанный список в 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
Я хочу спросить, можем ли мы инициализировать узел (вместе с его данными и ссылкой на следующий узел) одним вызовом инициализации?
В приведенном выше коде я сначала передаю атрибут данных узла в вызове инициализации, а затем устанавливаю ссылку с помощью атрибута next_node. Есть ли способ сделать обе вещи в одном вызове инициализации?
Да, вы можете добиться этого, вложив экземпляры вашего класса.
Например, один вкладыш для установки всех трех узлов за один вызов.
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
Я добавлю функциональную версию, используя reduce
, сборка обратная, 4 данных корневого узла (вы можете изменить данные):
from functools import reduce
ll = reduce(lambda x, y: Node(y, x), (1, 2, 3, 4), Node(0))
Вот вам живой пример
Конечно:
firstNode = Node(15, secondNode)