tail 如何在链接结构中工作?
How tail works within a linked structures?
我是编程新手,我正在使用 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
我希望我的问题足够清楚。我非常感谢你的时间。谢谢!
After this line of code, the self._tail becomes the second element and this seems pretty logical as I have to keep tracking the tail as I keep on adding elements and self._head now have two elements but in code there is no line of code where to self._head is added a new element.
我认为您可能在这里遗漏的是 self._head 本身不是 Bag,而是指向 _BagListNode object.
的指针
当新物品被添加到包中时,它们作为下一个节点附加在前一个尾巴上,成为新的尾巴。这根本不会影响您的实施中的头部。另一种可能更清晰的实现可以简单地使一个项目成为列表的新头部,如图所示:
我的数据结构教授给我的一个技巧是画出正在发生的事情的图片,以提高您的直觉理解。你可以考虑画一幅图,画出当第三件物品被放入包中时会发生什么。
我是编程新手,我正在使用 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
我希望我的问题足够清楚。我非常感谢你的时间。谢谢!
After this line of code, the self._tail becomes the second element and this seems pretty logical as I have to keep tracking the tail as I keep on adding elements and self._head now have two elements but in code there is no line of code where to self._head is added a new element.
我认为您可能在这里遗漏的是 self._head 本身不是 Bag,而是指向 _BagListNode object.
的指针当新物品被添加到包中时,它们作为下一个节点附加在前一个尾巴上,成为新的尾巴。这根本不会影响您的实施中的头部。另一种可能更清晰的实现可以简单地使一个项目成为列表的新头部,如图所示:
我的数据结构教授给我的一个技巧是画出正在发生的事情的图片,以提高您的直觉理解。你可以考虑画一幅图,画出当第三件物品被放入包中时会发生什么。