轨道
/
C++
C++
/
练习
/
链表
链表

链表

中等

简介

你正在参与一个项目,为繁忙的铁路网开发一套列车调度系统。

有人请你为调度系统中的列车路线开发一个原型。每条路线由一串火车站组成,某趟列车会依次停靠这些车站。

说明

你的团队决定用双向链表来表示时刻表中的每条火车路线。 火车路线沿途的每个车站都由链表中的一个节点表示。

你不需要操心各个车站的到达和出发时间。 每个车站只用一个数字表示就好。

路线可以延长,在路线的开头或末尾增加车站。 也可以从路线的开头或末尾移除车站来缩短。

有时某个车站会关闭,这时即使它不在路线的开头或末尾,也需要把它从路线中移除。

路线的大小不是以火车行驶的距离来衡量,而是以它停靠的车站数量来衡量。

Note

链表是计算机科学中的一种基础数据结构,常用来实现其他数据结构。 顾名思义,它是一串链接在一起的节点。 它是一串“节点”,其中每个节点都链接到它的一个或多个相邻节点。 在单向链表中,每个节点只链接到它后面的那个节点。 在双向链表中,每个节点既链接到它前面的节点,也链接到它后面的节点。

如果你想深入了解链表,可以看看这篇文章,它用漂亮的图示做了讲解。

本练习在 C++ 轨道中是如何组织的

链表可以用多种方式实现,底层数据结构也可以各不相同,但这里我们要求你以面向对象的方式实现链表。

在 linked_list_test.cpp 文件中,你会看到其中调用了一个模板化的List类。 你需要为这个类编写以下成员函数:

  • push 把一个元素添加到链表末尾,
  • pop 删除并返回链表的最后一个元素,
  • shift 删除并返回链表的第一个元素,
  • unshift 把一个元素添加到链表开头,
  • count 返回当前链表中元素的总数。

最后,除了上面列出的方法,我们还希望你实现erase。 erase会接收一个实参,也就是要从链表中删除的值。 如果这个值出现多次,只删除第一个。 它应该返回是否有元素被删除。

虽然没有对此进行测试,但当你在空的List上调用pop和shift时,可能想抛出一个异常。


来源

经典的计算机科学主题
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
C++ Exercism

准备好开始 链表 了吗?

注册 Exercism,借助 19 个概念100 个练习 和真人导师指导,学习并掌握 C++,全部免费。