Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python自动链接链表的值_Python_Data Structures - Fatal编程技术网

如何使用python自动链接链表的值

如何使用python自动链接链表的值,python,data-structures,Python,Data Structures,我已经开始使用python学习数据结构。我从昨天起就一直坚持这个问题,还没有想到解决办法。我在internet上看到的教程手动链接链接列表的值。我一直在寻找和思考是否有一种方法可以自动完成。 下面是tutorialspoint.com上的示例代码 class Node: def __init__(self, dataval=None): self.dataval = dataval self.nextval = None class SLinkedLis

我已经开始使用python学习数据结构。我从昨天起就一直坚持这个问题,还没有想到解决办法。我在internet上看到的教程手动链接链接列表的值。我一直在寻找和思考是否有一种方法可以自动完成。 下面是tutorialspoint.com上的示例代码

class Node:
    def __init__(self, dataval=None):
        self.dataval = dataval
        self.nextval = None

class SLinkedList:
    def __init__(self):
        self.headval = None

    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval

list = SLinkedList()
list.headval = Node("Mon")
e2 = Node("Tue")
e3 = Node("Wed")

# Link first Node to second node
list.headval.nextval = e2

# Link second Node to third node
e2.nextval = e3

list.listprint()

正如@Reut Sharabani在评论中所说,节点构造函数只接受dataval,并将下一个值设置为None。要获得所需的行为,必须在节点旁边创建第二个构造函数,在其中指定dataval。然后,在SLinkedList类中,从尾部节点开始,向头部移动,反向构造链表。
如果这就是您所说的自动。

当然,这里有一种方法可以做到这一点,而不会中断当前的设置 你的课程太多了:

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

    @classmethod
    def from_iterable(cls, iterable):
        node = cls()
        iterable = iter(iterable)
        try:
            node.data = next(iterable)
        except StopIteration:
            return None
        node.next_node = cls.from_iterable(iterable)
        return node

class SLinkedList:
    def __init__(self, head_node=None):
        self.head_node = head_node

    @classmethod
    def from_iterable(cls, iterable):
        return cls(Node.from_iterable(iterable))

    def listprint(self):
        print_node = self.head_node
        while print_node is not None:
            print(print_node.data)
            print_node = print_node.next_node

my_list = SLinkedList.from_iterable(["Mon", "Tue", "Wed"])
my_list.listprint()
有输出

Mon
Tue
Wed
我在这里重命名了一些位(记住
list
是Python内置的!),并且 然后,将一些函数签名更改为更自然一些,但是 我刚才所做的主要是添加了两个来自iterable的
方法

这是一个非常递归的实现。如果您需要比大约大的列表 1000个元素,您必须以while循环的形式编写它们(尽管
在纯Python中这样的链表实现永远不会很快)

当然可以将元素添加到链表中。您可以在第一个位置(普通)或现有节点之后插入元素(稍微复杂一些,因为您必须指定如何指定该节点)


你可以。但是您必须向构造函数传递一个节点,使其链接到某个对象。目前,节点只接收自己的数据(dataval),因此它只知道这些数据。
...
class SLinkedList:
    def __init__(self):
        self.headval = None

    def listprint(self):
        printval = self.headval
        while printval is not None:
            print (printval.dataval)
            printval = printval.nextval

    def insertfirst(self, val):
        node = Node(val)
        node.nextval = self.headval
        self.headval = node

>>> lst = SLinkedList()     # do not use list which is the standard library list
>>> lst.insertfirst("Wed")
>>> lst.insertfirst("Tue")
>>> lst.insertfirst("Mon")
>>> lst.listprint()
Mon
Tue
Wed