昨天在链表的顺序结构基础上对链表链式存储即单链表做了简单的介绍,今天继续。
1、单链表的读取
获得链表第i个元素的思路
(1)声明一个结点p指向链表的第一个结点,初始化j从1开始
(2)当j<1时,就遍历链表,让p的指针向后移动,不断指向下一结点,j累加1
(3)若到链表末尾p为空,说明第i个元素不存在
(4)若查找成功,返回结点p的数据
可见,单链表的查找确实不如顺序表来的快。
2、单链表的插入和删除
插入的思路:
(1)和查找一样,先声明结点p,遍历链表,找到第i个元素
(2)若找到,则声明一个空结点s
(3)将元素e赋给s->data
(4)s->next=p->next;p->next=s
删除算法的思路:
(1)和查找一样,先声明结点p,遍历链表,找到第i个元素
(2)若查找成功,将欲删除的结点p->next赋给q
(3)p->next=q->next
(4)将q的值赋给e,作为返回
(5)释放q,返回成功
可见,插入和删除都分为两部分,先查找,然后进行插入或者删除的操作
从时间复杂度角度来说,插入和删除的时间复杂度都是O(n),但是如果我们希望从第i个位置开始,插入10个元素,对于顺序存储结构来说,每一次插入都需要移动n-i个元素,每次都是O(n),而对于链式存储,找到第i个元素,此时是O(n),接下来只是简单的赋值而已,时间复杂度都是O(1),可见,对于插入或者删除越复杂的操作,单链表的效率越高。
3、单链表的整表创建
(1)声明一结点p和计数变量i
(2)初始化一个空链表L
(3)让L的头结点的指针指向null,即建立一个带头结点的单链表
(4)循环
生成一新节点赋给p
随机生成一个数赋给p的数据域
将p插入到头结点与前一新结点之间
这种方式成为头插法,相应的还有尾插法