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
зачем брать переменную "голова"? почему мы не можем продолжить с linkedlist
Нарисуйте схему для пары случаев, и вы сами найдете ответ. en.wikipedia.org/wiki/Linked_list#/media/…
linkedlist
— ссылка на начало списка. head
, несмотря на название, является просто ссылкой на конец списка, а точнее на узел, к которому вы будете присоединять новый узел. Лучшее определение 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
(после определения) всегда относится к концу связанного списка.Когда вы перебираете массив, вы просто добавляете новый узел в конец, а затем обновляете конец.
Если вы используете обычное соглашение о пустом связанном списке, представленном фиктивным узлом, все становится еще проще, так как теперь вам не нужен специальный регистр для head is None
.
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
Да, head
— это действительно плохое имя в коде вопроса. Кроме того, код в вопросе ищет хвост списка снова и снова на каждой итерации цикла for
, что требует квадратичного времени.
Удален тег
dsa
: речь не идет об алгоритме цифровой подписи.