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)

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...