本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。
一方面用于学习记录与分享,另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。
如有侵权,请留言作删文处理。
课程视频链接:
数据结构与算法基础–第3周11–2.5线性表的链式表示和实现11–单链表基本操作9–查找插入删除算法分析
📚 📌 📝 🔍 ⚠️ 😊 ⭐ 🔗 👋 ❓ 💬 🔹 🔸 🔖 ❗️ 💟 ➔
📚 【Week03】11_线性表的链式表示和实现10
单链表查找插入删除算法分析
【查找算法】
【算法描述】按值查找:根据指定数据,获取该数据地址(返回地址)
// 在线性表 L 中查找值为 e 的数据元素
// 找到,则返回 L 中值为 e 的数据元素的地址
// 查找失败,返回 NULL
Lnode *LocateElem_L(LinkList L, ElemType e){
// 初始化
p = L->next;
// 依次向后扫描
while(p && (p->data!= e)){
p = p->next;
}
return p;
}
【算法描述】按值查找:根据指定数据,获取该数据位置序号(返回位置)
// 在线性表 L 中查找值为 e 数据元素的位置序号
// 找到,则返回 L 中值为 e 的数据元素的位置序号
// 查找失败,返回 NULL
int LocateElem_L(LinkList L, ElemType e){
// 初始化
p = L->next;
j = 1;
// 依次向后扫描
while(p && (p->data!= e)){
p = p->next;
j++;
}
if(p){
return j;
}
else{
return 0;
}
}
【插入算法】
【算法描述】
// 在线性表 L 中第 i 个数据元素之前插入数据元素 e
Status ListInsert_L(LinkList L, int i, ElemType &e){
// 初始化
p = L;
j = 0;
// 寻找第 i-1 个结点,p 指向 i-1 结点
while(p && (j<(i-1))){
p = p->next;
++j;
}
// i 大于表长 +1 或者小于 1,插入位置非法
if(!p || (j>(i-1))){
// 第 i 个元素不存在
return ERROR;
}
// 生成新结点 s,将结点 s 的数据域置为 e
s = new LNode;
s->data = e;
// 将结点 s 插入 L 中
s->next = p->next;
p->next = s;
return OK;
}// ListInsert_L
【删除算法】
【算法描述】
// 将线性表 L 中第 i 个数据元素删除
Status ListDelete_L(LinkList &L, int i, ElemType &e){
// 初始化
p = L;
j = 0;
// 寻找第 i-1 个结点,并令 p 指向其前驱
while(p->next && (j<(i-1))){
p = p->next;
++j;
}
// 删除位置是否合理判断
if(!p->next || (j>(i-1))){
// 第 i 个元素不存在
return ERROR;
}
// 临时保存被删除结点的地址,以备释放
q = p->next;
// 改变删除结点前驱结点的指针域
p->next = q->next;
// 保存删除结点的数据域
e = q->data;
// 释放删除结点的空间
delete q;
return OK;
}// ListDelete_L
📌总结
(1) 查找算法
因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为 O(n)。
(2) 插入和删除
因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为 O(1)。
但是,如果要在单链表中进行前插和删除操作,由于要从头查找前驱结点,所耗时间复杂度为 O(n)。