C++基础教程
——
作业及参考答案全部汇总文档
节8链表阶段作业

最新版本V2.0
王道C++团队
COPYRIGHT ⓒ 2021-2024. 王道版权所有

基础题篇

Gn!

下面都是一些基础的语法、概念编程练习题。

手动实现一条单链表(基础题/重点)

Gn!

基于以下头文件,手动实现一条单链表:

手动实现单链表是后续一切数据结构学习的前提和基础,所以一定要重视单链表的实现,一定要自己百分百手动将这里面的函数全部实现。

参考代码如下:

参考代码:

以下是实现源文件的代码,即所有函数的实现如下:

再给出一个测试用例,如下:

以上。

链表基础面试题:快慢指针法

Gn!

基于链表的结点定义:

以及相应的二级指针尾插法构建单链表:

后续单链表的面试题,也请基于此链表结点的定义,以及尾插法构建链表实现。

利用快慢指针法,直接求解下列两个问题:

1.求链表中间结点的值

2.判断单链表是否有环

注意:

不仅要定义函数实现对应功能,还需要编写测试用例,进行测试。尤其是测试单链表有环,要自己构建出一条有环的单链表进行测试。

参考代码如下:

参考代码:

求链表中间结点的值以及相应测试代码:

判断单链表有环以及相应测试代码:

以上。

链表基础面试题:反转单链表

Gn!

给定一条单链表,请反转这条单链表。

举例:

输入: 1 --> 2 --> 3

输出: 3 --> 2 --> 1

基于以下函数的声明实现:

注意:

请采用递归和循环迭代两种方式求解这个问题。

参考代码如下:

参考代码如下:

两种方式实现反转单链表,参考代码如下:

测试用例如下:

以上。

链表基础面试题:合并两条有序单链表

Gn!

合并两条有序的单向链表,使得合并后的链表也是有序的 (要求: 不能额外申请堆内存空间)。

输入:

list1: 1 --> 3 --> 5

list2: 2 --> 4 --> 6

输出:

1 --> 2 --> 3 --> 4 --> 5 --> 6

可以直接基于以下函数声明来进行实现。

要求使用递归和循环迭代两种方式实现这个功能。

注:循环实现时,可以思考一下加头结点的实现与不加的区别。

不仅要定义函数实现对应功能,还需要编写测试用例,进行测试。

参考代码如下:

参考代码:

循环迭代方式实现合并有序单链表,不带头结点的实现:

循环迭代方式实现合并有序单链表,带头结点的实现:

递归方式实现合并有序单链表,参考实现代码如下:

测试代码如下:

以上。

扩展题篇

Gn!

以下题目都属于扩展题。

以下单链表的扩展编程题,都基于以下链表结点的定义,以及一个尾插法构建单链表的实现:

接下来请你实现以下一些功能。

扩展:删除连续重复结点

Gn!

删除单链表中连续出现的重复节点,具体来说,当链表中有相邻的两个或多个节点的值相同时,删除后续的重复节点,只保留第一个出现的节点。

举例:

单链表:1 -> 2 -> 2 -> 3 -> 4 -> 4 -> 4 -> 5

删除后将得到链表:1 -> 2 -> 3 -> 4 -> 5

 

单链表:1 -> 1 -> 2 -> 3 -> 3 -> 3 -> 4

删除后将得到链表:1 -> 2 -> 3 -> 4

请基于以下函数声明实现这个功能:

注:该函数不会修改头指针,所以使用一级指针传参且函数也没有返回值。

参考代码如下:

参考代码实现如下:

以上。

扩展:检查回文单链表

Gn!

给定一条单链表,请检查它是否为回文单链表。所谓回文单链表,即从头到尾和从尾到头数据都相同的单链表。

举例:

1 -> 2 -> 3 -> 2 -> 1 就是一条回文单链表

1 -> 2 -> 2 -> 1 也是一条回文单链表

请基于以下函数声明实现这个功能:

注意:

  1. 针对单链表进行回文检查,不应改变此链表的结构。若程序必须改变链表结构,需在判断完成后还原。

  2. 空链表或只有一个结点的链表默认就是回文链表。

提示,检查回文链表只需要以下几步就可以实现了:

  1. 找到单链表的中间结点

  2. 将链表的后半部分反转(思考反转的起点是哪一个结点?)

  3. 将反转后半部分的结点和前半部分逐一比较,如果数据都相同则是回文链表,若有任一结点不同则不是回文链表。

  4. 此过程会改变链表结构,所以需要考虑还原。(如何实现这个还原操作呢?)

参考代码如下:

参考代码实现如下:

以上。

扩展:实现真正意义上的链表结点去重

Gn!

给定一个单链表,请编写一个函数来删除链表中所有重复的节点,只保留第一次出现的节点,注意这里不再强调重复结点连续出现,允许间断出现。

举例:

输入: 1 -> 2 -> 3 -> 2 -> 4 -> 3 -> 5

输出: 1 -> 2 -> 3 -> 4 -> 5

注意:要求在O(n)的时间复杂度内,完成这个问题的求解。

提示:计数去重,这是非常典型的哈希表的应用场景,不妨考虑使用哈希表来完成这个操作。

参考代码

首先给出单链表和哈希表实现的头文件:

紧接着是哈希表的实现源文件:

紧接着是链表的实现源文件:

最后是实现单链表去重,以及相关的测试代码:

以上。

The End