我们可以在 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
我实现了一个像
这样的单向链表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