[数据结构]第二章线性表(3)——单链表

单链表

[数据结构]第二章线性表(3)——单链表

[数据结构]第二章线性表(3)——单链表

什么是单链表?

[数据结构]第二章线性表(3)——单链表

单链表的定义

[数据结构]第二章线性表(3)——单链表

别名

[数据结构]第二章线性表(3)——单链表

[数据结构]第二章线性表(3)——单链表

注释:或者可以理解为指向头节点的指针既可以表示整个单链表也可以表示头节点,为了便于区分才建议使用 typedef 进行重命名,以方便区别其不同的含义

头插法建立单链表

[数据结构]第二章线性表(3)——单链表

单链表的基本操作

单链表的初始化

不带头节点的单链表的初始化

[数据结构]第二章线性表(3)——单链表

带头节点的单链表的初始化

[数据结构]第二章线性表(3)——单链表

两者区别是什么?

[数据结构]第二章线性表(3)——单链表

总结

[数据结构]第二章线性表(3)——单链表

插入和删除

[数据结构]第二章线性表(3)——单链表

插入

按位序插入(带头节点的单链表)

[数据结构]第二章线性表(3)——单链表

具体实现

分析在表头插入

[数据结构]第二章线性表(3)——单链表

分析为什么不能颠倒

[数据结构]第二章线性表(3)——单链表

分析在表中插入

[数据结构]第二章线性表(3)——单链表

分析在表尾插入

[数据结构]第二章线性表(3)——单链表

分析插入位置超出表长

[数据结构]第二章线性表(3)——单链表

总结

[数据结构]第二章线性表(3)——单链表

按位插入(不带头节点)

[数据结构]第二章线性表(3)——单链表

具体实现

[数据结构]第二章线性表(3)——单链表

结论:不带头节点的单链表,写代码更不方便,除非特别声明,默认推荐使用带头节点的实现方式,还有要注意在考试中带头、不带头都有可能考察,注意审题。

指定节点的后插操作

[数据结构]第二章线性表(3)——单链表

指定节点的前插操作

通过传入头指针实现前插

[数据结构]第二章线性表(3)——单链表

先进行后插,然后交换前后数据,以此实现前插

[数据结构]第二章线性表(3)——单链表

[数据结构]第二章线性表(3)——单链表

删除

带有头节点版本

[数据结构]第二章线性表(3)——单链表

具体实现

[数据结构]第二章线性表(3)——单链表

删除指定结点

[数据结构]第二章线性表(3)——单链表

如果P是最后一个节点,咋办?

只能从表头表头依次寻找前驱,时间复杂度O(n)

[数据结构]第二章线性表(3)——单链表

单链表的局限性:无法逆向检索!!

总结

[数据结构]第二章线性表(3)——单链表

查找

按位查找(带头节点)

[数据结构]第二章线性表(3)——单链表

#####按值查找(带头节点)

[数据结构]第二章线性表(3)——单链表

求表的长度(带头节点)

[数据结构]第二章线性表(3)——单链表

总结

[数据结构]第二章线性表(3)——单链表

单链表的建立方法

[数据结构]第二章线性表(3)——单链表

PS:找不到对象就娶一个数据元素吧!哈哈

尾插法

第一种方法:

[数据结构]第二章线性表(3)——单链表

问题:时间复杂度太高!!可以用一个指针记录最后一个数据元素的位置来优化时间。

优化之后:

[数据结构]第二章线性表(3)——单链表

头插法

[数据结构]第二章线性表(3)——单链表

具体实现:

[数据结构]第二章线性表(3)——单链表

总结

[数据结构]第二章线性表(3)——单链表