你正在参与一个项目,为繁忙的铁路网开发一套列车调度系统。
有人请你为调度系统中的列车路线开发一个原型。每条路线由一串火车站组成,某趟列车会依次停靠这些车站。
你的团队决定用双向链表来表示时刻表中的每条火车路线。 火车路线沿途的每个车站都由链表中的一个节点表示。
你不需要操心各个车站的到达和出发时间。 每个车站只用一个数字表示就好。
路线可以延长,在路线的开头或末尾增加车站。 也可以从路线的开头或末尾移除车站来缩短。
有时某个车站会关闭,这时即使它不在路线的开头或末尾,也需要把它从路线中移除。
路线的大小不是以火车行驶的距离来衡量,而是以它停靠的车站数量来衡量。
链表是计算机科学中的一种基础数据结构,常用来实现其他数据结构。 顾名思义,它是一串链接在一起的节点。 它是一串“节点”,其中每个节点都链接到它的一个或多个相邻节点。 在单向链表中,每个节点只链接到它后面的那个节点。 在双向链表中,每个节点既链接到它前面的节点,也链接到它后面的节点。
如果你想深入了解链表,可以看看这篇文章,它用漂亮的图示做了讲解。
链表可以用多种方式实现,底层数据结构也可以各不相同,但这里我们要求你以面向对象的方式实现链表。
在 linked_list_test.cpp 文件中,你会看到其中调用了一个模板化的List类。
你需要为这个类编写以下成员函数:
push 把一个元素添加到链表末尾,pop 删除并返回链表的最后一个元素,shift 删除并返回链表的第一个元素,unshift 把一个元素添加到链表开头,count 返回当前链表中元素的总数。最后,除了上面列出的方法,我们还希望你实现erase。
erase会接收一个实参,也就是要从链表中删除的值。
如果这个值出现多次,只删除第一个。
它应该返回是否有元素被删除。
虽然没有对此进行测试,但当你在空的List上调用pop和shift时,可能想抛出一个异常。