Почему необходимо брать новую переменную "голова" в цикле for?

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

Удален тег dsa: речь не идет об алгоритме цифровой подписи.

trincot 31.03.2023 15:19

Нарисуйте схему для пары случаев, и вы сами найдете ответ. en.wikipedia.org/wiki/Linked_list#/media/…

Pete Kirkham 31.03.2023 15:21
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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 имеет два инварианта:

  1. head всегда относится к началу (возможно, пустого) связанного списка.
  2. 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, что требует квадратичного времени.

user2357112 31.03.2023 15:25

Другие вопросы по теме