算法与数据结构 --- 线性表 --- 链式表示与实现(下)

本文详细介绍了链表数据结构的三种常见类型:线性链表、循环链表和双向链表。线性链表通过头指针和尾指针实现插入操作;循环链表的尾结点指向前一个结点即头结点,便于遍历;双向链表每个结点包含两个指针,分别指向前后结点,增强了操作灵活性。此外,文章讨论了不同链表在时间效率上的比较,并强调了如何利用空间换取时间效率。
摘要由CSDN通过智能技术生成

第一部分 --- 线性表的链式表示和实现(12,13)

 

1.创建一个头指针和头指针指向的头结点

2.创建一个我们要插入的结点

3.进行插入

4.重复2,3步直到插入完毕

1.被挡住的部分是后插法 

2. r 是尾指针,L 是头指针

 

1.创建一个头指针,然后在堆区中通过new的方式创建一个头结点,并用头指针接收new后返回的地址,让头指针指向头结点,然后通过头指针让头结点的指针域为空指针,最终创建好一个空链表

2.创建一个尾指针,并让尾指针也指向头结点

3.在循环中创建新的结点,并以尾插的方式向链表中插入结点

(通过尾指针 r 进行操作并让尾指针不断移动)


第二部分 --- 循环链表

1.注意!循环链表是尾结点的指针域是指向头结点,而不是指向首元结点!!

2.循环链表的空表表示方法是:头结点的指针域指向它本身

1.对于循环链表而言,头结点的上一个结点就是链表的尾节点

2.判断链表读完(循环结束)时有两种情况:一种是我们读到了尾结点,循环结束,此时p->next就等于头指针L(头指针是指向头结点的指针);还有一种是我们读到了头结点,此时也就代表我们读完了尾结点,整个链表被读完了,此时P = 头指针L

1.在循环链表中我们常用的不是头指针而是尾指针,尾指针是指向链表尾结点的指针

2.在循环链表中通过尾指针找到首元结点的时候我们只需要先找到头结点,然后再通过头结点找到首元结点就可以了(在循环链表中尾结点的指针域指向头结点)

至于找到尾结点就更方便了,尾指针本身指向的就是尾结点

 

 1.注意:第二步中的表头指的是首元结点

2.循环链表用尾指针来表示,单向链表用头指针来表示


第三部分 --- 双向链表

1.双向链表的特点就是一个结点具有两个指针域。一个指针域用来指向结点的直接前驱(前一个结点),一个指针域用来指向结点的直接后继(后一个结点)

2.双向链表中的头结点中指向上一个结点的指针域为空指针,尾结点中指向下一个结点的指针域为空指针

3.双向链表的空表表示是:头结点的两个指针域都为空

 

 

1.所谓的对称性就是指:一个指针P指向双向链表中的一个结点,则这个指针P = 结点的前驱的后继指针域 = 结点的后继的前驱指针域

1.让a结点成为x结点的前驱

2.让x结点成为a结点的后继

3.让b结点成为x结点的后继

4.让x结点成为b结点的前驱

1.上面这个算法中直接调用了查找链表中的元素的算法 --- GetElemP_Dul ( ),找到元素后我们开始进行插入,如果没找到,证明输入错误,直接返回Error

2.插入结点前需要我们先创建结点

调整完删掉结点后的前驱和后继关系,我们还需要被删掉的结点销毁(释放堆区内存空间)

1.如果有需要的话我们可以自己创建一个e变量来存储被删掉的结点的数据

2.由于使用了查找算法,所以算法最终的时间复杂度是O(n)


第四部分 --- 单链表,循环链表和双向链表的时间效率比较

1.双向循环链表其实就是在用空间换时间(增加一个指针域换取时间效率的提高)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值