class Node:
def __init__(self, data):
self.data = data
self.ref = None
def Print_LL(linkedlist):
if linkedlist is None:
print("LinkedList is empty!!")
else:
while linkedlist is not None:
print(linkedlist.data)
linkedlist = linkedlist.ref
def arr_to_LL(arr, n):
linkedlist = None
for i in range(0,n):
new_node = Node(arr[i])
if linkedlist is None:
linkedlist = new_node
else:
head = linkedlist
while head.ref is not None:
head = head.ref
head.ref = new_node
return linkedlist
为什么要取“head”变量?为什么我们不能继续使用链表
linkedlist
是对列表头部的引用。 head
,尽管名称如此,只是对列表的end 的引用,或者更具体地说,是对您将附加新节点的节点的引用。 arr_to_LL
的更好定义可能是
def arr_to_LL(arr):
head = None
for v in arr:
new_node = Node(v)
if head is None:
head = new_node
else:
curr.ref = new_node
curr = new_node
return head
这个
for
循环有两个不变量:
head
总是指(可能为空)链表的前面。curr
(一旦定义)总是指链表的end。当你遍历数组时,你只需将一个新节点附加到末尾,然后更新末尾。
如果你使用由一个虚拟节点表示的空链表的通用约定,它会变得更加简单。
def arr_to_LL(arr):
# We'll store the length in the dummy node, because why not?
head = curr = Node(0)
for v in arr:
curr.ref = Node(v)
curr = new_node
head.data += 1
return head