Как tail работает в связанных структурах?

#python #list #data-structures #tail #head

#python #Список #структуры данных #хвост #head

Вопрос:

Я новичок в программировании, и я изучаю более сложные структуры данных с использованием Python, и мне трудно понять концепцию добавления элемента в связанный список с использованием заголовка и хвоста.

 class Bag:
    def __init__(self):
        self._head = None
        self._tail = None
        self._size = 0


 def add(self, item):
        newNode = _BagListNode(item)
        if self._head is None:
            self._head = newNode
        else:
            self._tail.next = newNode
        self._tail = newNode
        self._size  = 1

class _BagListNode(object):
    def __init__(self, item):
        self.item = item
        self.next = None
    def __repr__(self):
        return f"{self.item}"
 

Дело в том, что когда я добавляю первый элемент, все становится понятным. Поскольку сначала head равен None, он добавит newNode как в tail, так и в head . Проблема начинается, когда я добавляю второй элемент: Я не понимаю, почему второй элемент добавляется к элементу, который был добавлен ранее, одновременно с self._tail выполнением этой строки кода self._tail.next = newNode . После этой строки кода self._tail он становится вторым элементом, и это кажется довольно логичным, поскольку я должен продолжать отслеживать хвост, поскольку я продолжаю добавлять элементы, и self._head теперь у меня есть два элемента, но в коде нет строки кода, в которую self._head добавляется новый элемент.

Например:

 bag = Bag()
    bag.add(1)
    bag.add(2)
    bag.add(3)
print(bag._head.item, bag._head.next.item, bag._head.next.next.item)
 

и в результате получается:

 1 2 3
 

Надеюсь, мой вопрос достаточно ясен. Я очень ценю ваше время. Спасибо!

Комментарии:

1. Когда в связанном списке есть ровно один элемент, оба self._head и self._tail ссылаются на этот один элемент. Это self._tail.next = newNode строка, которая создает ссылку от первого элемента ко второму элементу.

2. Большое вам спасибо за ваш ответ и время! Теперь это намного понятнее! Удачи!

Ответ №1:

После этой строки кода self._tail становится вторым элементом, и это кажется довольно логичным, поскольку я должен продолжать отслеживать хвост, продолжая добавлять элементы и self.у _head теперь есть два элемента, но в коде нет строки кода, где self ._head добавляется новый элемент.

Я думаю, что вам может не хватать этого self._head — это не пакет сам по себе, а скорее указатель на объект _BagListNode .

Когда новые элементы добавляются в пакет, они прикрепляются как следующий узел к предыдущему хвосту, становясь новым хвостом. Это никак не влияет на head в вашей реализации. Альтернативная, возможно, более понятная реализация может просто сделать элемент новым заголовком списка, как показано здесь:

Процедура добавления связанного списка (общий случай)

Один из советов, который дал мне мой профессор по структурам данных, заключался в том, чтобы нарисовать картину того, что происходит, чтобы улучшить ваше интуитивное понимание. Вы могли бы подумать о том, чтобы нарисовать картину того, что происходит, когда третий элемент вставляется в пакет.

Комментарии:

1. Ну, одна из моих первых реализаций простого связанного списка была похожа на вашу вышеупомянутую альтернативу, сделав новый элемент head . Затем я перешел к этой теме, которая действительно создала для меня некоторые проблемы. Большое спасибо за совет! Я постараюсь его использовать! Я очень ценю ваше время! Это помогло!