我们可以在 python 中使用 for 循环将元素插入到链表中吗?

Can we insert elements into a linked list using for-loop in python?

我实现了一个像

这样的单向链表
class LinkList:
    def __init__(self):
        self.head = None 

class Node:
     def __init__(self, val=0):
        self.val = val
        self.next = None
a = [2, 5, 6, 3, 5, 6, 9]

我想知道我们是否可以使用 for 循环将上述列表的每个元素插入到链表中。

我试过这样做,但没有将所有值添加到列表中。这是我的尝试:

a = [2, 5, 6, 3, 5, 6, 9]
l.head = Node(a[0])
l.head.next = Node(a[1])
for i in range(1, len(a) - 1):
    Node(a[i]).next = Node(a[i + 1])

在运行之后,我打印链表,它只输出:

2
5

如何才能做到这一点?

是的,您可以使用 for 循环。我将首先介绍我将如何做到这一点。

首先改进Node构造函数,这样你就可以为它的next传递一个值属性:

class Node:
     def __init__(self, val=0, nxt=None):
        self.val = val
        self.next = nxt

因此,如果您不传递该额外参数,这没有任何区别,但有时也传递该参数可能很有用。

然后改进 LinkList class 的构造函数,以便您可以选择传递一系列值(例如作为列表)。然后构造函数可以进行循环。以相反的顺序遍历给定的序列是非常优雅的(我认为),这样你就可以 prepend 值到列表中:

class LinkList:
    def __init__(self, seq=None):
        self.head = None 
        if seq is not None:
            for val in reversed(seq):
                self.head = Node(val, self.head)

现在您可以从一行中的列表创建链接列表:

l = LinkList([2, 5, 6, 3, 5, 6, 9])

至于你的尝试。您在循环体中所做的分配是每次都分配给 new 节点,而不是先前添加的节点。因此,您的节点不会全部链接在一起。在每次迭代中,您创建 两个 个节点,第一个节点与第二个节点链接,但该对与其他任何节点保持断开连接。

相反,您应该保留对先前创建的节点的引用,并在循环的下一次迭代中使用它。显然,循环的一次迭代应该只创建一个 Node 实例,并从您保留的引用链接它。

这是对您尝试的解决方法:

l = LinkList()
a = [2, 5, 6, 3, 5, 6, 9]
node = Node(a[0])
l.head = node
for val in a[1:]:
    node.next = Node(val)
    node = node.next