微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tail 在链接结构中如何工作?

如何解决tail 在链接结构中如何工作?

我是编程新手,正在使用 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

我希望我的问题足够清楚。我非常感谢你的时间。谢谢!

解决方法

在这行代码之后,self._tail 成为第二个元素,这看起来很合乎逻辑,因为我必须继续跟踪尾部,因为我不断添加元素,而 self._head 现在有两个元素,但在代码中没有向 self._head 添加新元素的代码行。

我认为您在这里可能缺少的是 self._head 本身并不是一个 Bag,而是一个指向 _BagListNode 对象的指针。

当新物品被添加到包中时,它们作为下一个节点贴在前一个尾部,成为新的尾部。这根本不会影响您的实现中的头部。另一种可能更清晰的实现可以简单地将一个项目作为列表的新头部,如下图所示:

Linked List adding procedure (general case)

我的数据结构教授给我的一个技巧是画一幅正在发生的事情的图,以提高你的直觉理解。您可以考虑画一张图,说明将第三件物品插入袋子时会发生什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。