2.3.1 单链表的定义
什么是单链表?
用代码定义一个单链表
(利用typedef简化数据类型的名字)
强调这是一个单链表——使用LinkList
强调这是一个结点——使用LNode*
不带头结点 的单链表 :
(L = NULL 防止脏数据 )
带头结点的单链表:
(头节点不存储数据)
知识回顾与重要考点:
2.3.2-1单链表的插入和删除
按位序插入(带头结点):
ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e。
需要找到第i-1个结点,将新节点插到其后。
(最好时间复杂度O(1),最坏时间复杂度O(n),平均时间复杂度O(n))
按位序插入(不带头结点):
(与带头结点的插入的区别就是表首插入时头指针的改变)
指定结点的后插操作:
指定结点的前插操作:
方法一:循环查找p的前驱结点q,再对q后插,时间复杂度O(n)
方法二:
(时间复杂度O(1),我愿称之为偷天换日)
位序删除(带头结点)
ListDelet(&L,i,&e):删除操作。删除表L中第i个位置的元素,并且用e返回元素的值。
指定结点的删除:
(我惊呆了 ,不过这个有bug,万一是删除最后一个结点,只能遍历)
知识回顾与重要考点:
2.3.2-2 单链表的查找
按位查找:
(平均时间复杂度O(n))
封装(基本操作)的好处:
避免重复代码,简洁,易维护
按值查找:
求表的长度:
知识回顾与重要考点:
2.3.2-3 单链表的建立
如果给你很多元素,你怎怎么把它们存到单链表内呢
第一步:初始化一个单链表
第二部:每次取一个数据元素,插入到表尾/表头
尾插法建立单链表:
(每次都要从表头遍历到最后一个结点,时间复杂度为O(n^2))
为了节约时间,可以申请一个表尾指针:
头插法建立单链表:
头插法的链表逆置是非常重要的应用。
建议:本章所有的建立方法都是有头结点的,可以思考一下无头结点的实现算法。