我知道在 Python 类创建过程中可以重载一些特定的功能,这样当在创建的对象上调用一些 Python 的内置函数时,它们能够正确地对它们进行操作,即。
class Node(object):
def __init__(self, contents=None,leftNode=None, rightNode=None):
super(Node, self).__init__()
self.__leftNode = leftNode
self.__rightNode= rightNode
self.__contents = contents
# OverLoad the str function. Prints the address of the Node, and it's contents.
def __str__(self):
addr=repr(self).split(' ')[-1][:-1]
return str('Addr: {0}\tContents: {1}'.format(addr, self.__contents))
这允许漂亮地打印在节点对象上调用 print 或 str(...) 时输出的数据。我想知道的是,如果有一种方法可以对 list(...) 做同样的事情,如果我要传递一个已实现的链表对象,它将能够返回一个 python 列表实现,这只会将所有节点内容附加到列表中,然后返回它。
我知道这听起来有点简单,而且没有必要,但即将生成一个二叉树类实现,并且希望能够自己生成一个堆排序能力列表。我试图实现 iter 属性,但只是着手创建一个奇怪的无限循环。
编辑
链接到 LinkedListData 类型的完整实现:Linked List Gist .
本身与 Python 的链表之间的主要区别是更容易附加到列表的任何一侧,并且能够启用类型安全,这可以通过从一开始就在列表中指示类型来打开。添加了 @Leva7 提供的实现提示。 因为这是我的第一个“纯”数据结构,所以关于最佳实践的任何提示,没有 DocStrings 都会更加熟悉这些,我们将不胜感激和欢迎,代码库中的低效率也是如此。
请您参考如下方法:
这是通过实现 __iter__ 方法来完成的。列表构造函数将使用它来迭代您的对象并从中创建一个列表。请记住,它应该是一个生成器方法,而不是返回一个列表。
例子:
class Test:
def __iter__(self):
for i in range(5):
yield i
ls = list(Test())
print(ls)
输出将是:
[0, 1, 2, 3, 4]
在您的情况下,您将获取第一个节点,直到结束(在您的实现中以某种方式标记)您产生下一个节点,所以类似这样:
def __iter__(self):
curr_node = self
while curr_node.__not_last:
yield curr_node.__contents
curr_node = curr_node.__rightNode
为此,您需要在 Node 对象中添加一个 __not_last bool 属性
供将来引用,here是OP的全链表实现
