type
status
date
slug
summary
tags
category
icon
password
需要实现一个链表,首先要定义链表中的每个节点的模板,这里使用
struct
关键字来定义。
定义一个节点,他有数据域
和指针域
,其中ElemType
为元素类型,为了定义元素类型方便且每次更改类型都不用大规模修改代码,我这里使用typedef
关键字给int取别名为ElemType
。其中Status枚举是后面代码需要返回状态值要用的。
- 初始化
- 链表需要有一个头节点
- 头节点数据域可以没有数据
- 头节点的指针域需要指向第一个节点,因为是初始化,还没有第一个节点,所以指针域为
NULL
定义好节点后,就可以开始创建初始化代码了,首先要考虑的是:
下面是代码:
- 插入
- 接受参数是:链表(采用引用方式,因为要修改链表),要插入的位置,需要插入的元素
- 先定义一个
指针变量(p)
用来扫描链表 - 定义一个整型变量(j)用来记录扫描到第几个节点
- 开始循环每次扫描都判断是否到达了插入位置;且
指针变量(p)
不能为空,因为是空则说明已经扫面到链表末尾。循环内部让p
向后移动,j
计数加一。 - 判断是否达到最后一个,或者传入的位置是否有误(这里可以理解为经过上面的计算,传入的
i
是否大于链表的长度或者小于链表的长度) - 上方代码均正常执行,先定义新节点,交换节点指针域。
初始化链表以后,就需要插入元素,第一个也好最后一个也罢,都能用计算的方式判断。
插入的步骤是:
- 删除
需要删除某个元素,我们同样通过循环找到需要删除的节点,然后交换指针域,使用delete关键字销毁节点。
- 查找某个位置的元素
与插入中寻找指定位置相似,我们通过循环找到指定位置,在判断是否超出链表边界,没有超出的话接直接返回节点数据元素。代码如下(因为不需要修改链表,参数不使用引用方式):
- 定位某个元素的位置
通过循环查找到值等于我们需要元素位置返回即可。
- 销毁
只需要循环将链表中包括头节点的所有节点全部销毁即可
- 清空
除了头节点,其他的节点全部销毁,并把头节点的指针域改为空
- 判空
判断头节点的指针域有没有指向其他节点即可
- 求长度
使用循环找到指针域为空的节点,并用变量计数即可得到长度
- 遍历输出线性表
循环到指针域为空的节点停止即可
提高题
- 将一个头结点指针为a单链表分解成两个单链表A和B,其头结点指针分别为a和b,使得A链表中含有原链表号为奇数的元素,而B链表中含有原链表A中序号为偶数的元素,且保持原来的相对顺序。
分析题目,我们把奇数位的数据保留在原链表,而偶数位的操作有点像删除元素的操作,但是我们删除以后,不需要将节点销毁,而是将节点添加到B链表。
总的来说,这道题就是一道删除与插入结合的操作。
- 将链接存储线性表逆置,即最后一个结点变成第一个结点,原来倒数第二个结点变成第二个结点,以此类推。
我们只需要链表中的第一个节点作为第二个节点的后驱,第二个节点作为第三个节点的后驱以此类推。
也就是第一个节点的地址给第二个节点的地址域,第二个的地址给第三个节点的地址域,以此类推,到最后一个时,我们需要让头节点的地址域连接到他。
挑战题
一艘满载货物的轮船在海上航行,突然轮船被海盗包围,海盗们挟持了轮船,并把所有船员拉到甲板上,一共64人。海盗船长告诉他们:现在我们要挟持你们的船,让你们的老板把赎金给我们,才能放你们和货物回去。现在我们先表诚意:释放一般船员回去。你们围成一圈,有第一个人数起,依次报数,数到第11人,便可以离开,直到剩下一半,也就是32人为止。
如果你是其中一个船员,你知道站在哪些位置能够安全离开吗?
- 思路1,使用循环链表,将其数据域设置为0,离开表示为1,循环时是1就跳过,并不加数数的顺序只需要循环到剩下一半时停止,最后统计是1的位置,就可以得出安全位置
- 思路2:查找规律,使用下标指针,隔十个删除一个,也就是将数组隔十个标记一个为1,下次循环到1将不计数,也就是true,当下标指针满64时,只需要余上64即可从头开始,这也类似循环链表的循环,只不过使用了取余来跳回0号索引。
- 作者:Rainvice
- 链接:https://rainvice.com/article/677ecbc3-00f1-4db8-af7a-929d59ee0fb6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。