一:单链表的读取
获得链表第i个数据,算法思路:
1.声明一个指针p指向链表的第一个结点,初始化j从1开始;
2.j<i时,遍历链表,p指针后移,j+1;
3.到链表尾部p为空或者j>i时,说明第i个节点不存在;
4.若查找成功,返回结点p的数据。
二:单链表的插入
扫描二维码关注公众号,回复:
190205 查看本文章
单链表第i 个数据插入结点的算法思路:
1.声明一指针p 指向链表头结点,初始化从1开始;
2.当j<i 时,就遍历链表, 让P 的指针向后移动,不断指向下结点,累加1;
3.若到连表末尾p 为空,则说明第i个结点不存在;
4.否则查找成功, 在系统中生成一个空结点s;
5.将数据元素e 赋值给s->data;
6.单链表的插入标准语句s->next=p->next; p- >next = s
三:单链表的删除
单链第1个数据删除结点的算法思路:
1.声明一指针p指向链表头指针,初始化j 从1开始;
2.当j<i 时,就遍历链表,让P 的指针向后移动,不断指向下一个结点,累加1;
3.若到链表末尾p为空,说明第个结点不存在;
4.否则查找成功,将欲删除的结点p->next 赋值给9;
5.单链表的删除标准语句p->next=q->next;
6.将q 结点中的数据赋值给e,作为返回;
7.释放q 结点;
分析一下刚才我们讲解的单链表插入和删除算法,我们发现,它们其实都是由两部分组成:第一部分就是遍历查找第1个结点; 第二部分就是插入和删除结点。
从整个算祛来说,我们很容易推导出: 它们的时间复杂度都是0(n)。
从整个算祛来说,我们很容易推导出: 它们的时间复杂度都是0(n)。
如果在我们不知道第i个结点的指针位置,单链表数据结构在插入和删除操作上,与线性表的顺序存储结构是没有大大优势的。但如果,我们希望从第i个位置,插入10 个结点,对于顺序存储结构意味着,每一次插入都需要移动n-i 个结点,每次都是0(n)。而单链表,我们只需要在第一次时,找到第i个位置的指针,此时为O(n),接下来只是简地通过赋值移动指针而已,时间复杂度都是0(1)。显然,对于插入或删除数据越频繁的操作,单链表的效率优势就越是明显。