单链表中非常重要的操作
取值:取单链表中第i个元素的内容
-
思考:顺序表中如何找到第i个元素?
-
【算法思路】从首元结点开始遍历每个结点,并且利用计数变量进行计数
-
【算法描述】
Status GetElem_L(LinkList L,int i,ElemType &e){ // 首先是判断传入的i是否合理 if(i<0||i>getLength(L)){ return ERROR; } LinkList p=L->next; // p指针此时指向首元结点 // 开始遍历链表 while(p&&i!=1){ i--; p=p->next; } e=p->data; return OK; }
按值查找——根据指定数据获取该数据所在位置
-
【算法思路】从首元结点开始遍历链表,将每个结点中的数据域存储的值与之比较,并且返回i即可。
-
【算法描述】
int getIndex_L(LinkList L,ElemType e){ LinkList p=L->next; int i=1; // 计数器 // 开始遍历链表 while(p&&e!=p->data){ ++i; p=p->next; // 移动指针指向结点 } if(p) return ERROR; return i; }
插入——在第i个结点前插入值为e的新结点
-
【算法思路】这里是将插入第i个结点之前,同时也需要找到第i-1个结点,然后插入到两者之间。
-
【算法步骤】
- 首先是找到第i-1个结点位置p
- 生成一个数据域为e的新结点s
- 插入新结点:1、新结点的指针域指向结点Ai
2、结点Ai-1的指针域指向新结点
-
【算法描述】
Status InsertElem(LinkList L,ElemType e,int i){ // 首先是判断i是否合理 if(i>getLength(L)||i<=0){ return ERROR; } LinkList p=L->next; // 找到第i-1个结点位置 while(p&&i!=2){ p=p->next; --i; } // 生成新结点,并且将数据存储在数据域中 Lnode s; s->data=e; // 将新结点的指针域指向第i个结点,第i-1个指针域指向新结点 s->next=p->next; p->next=s; return OK; }
-
【思考】能否先第i-1个结点的指针指向新结点,后新结点的指针域指向第i个结点
删除:删除第i个结点操作
-
【算法思路】
-
【算法步骤】
1、首先找到第i-1个结点的存储位置p,保存要删除的第i个结点的值
2、令p->next指向第i+1个结点位置
3、删除保存的结点的值,并且释放空间即可。 -
【算法描述】
Status DeleteElem(LinkList &L,int i,ElemType &e){ // 首先是判断i是否合理 if(i>getLength(L)) return ERROR; LinkList p=L; // 找到第i-1个结点位置,这里偷了个懒,运用i为计数器 while(p->next&&i>2){ i--; p=p->next; } LinkList q=p->next; // q变量来存储第i个元素 e=q->data; delete q; return OK; }
单链表的查找、插入、删除算法的时间效率
- 查找:
因为线性链表只能顺序存取,即在查找时要从头指针找起,查找时间复杂度为O(n) - 插入和删除
因为线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为O(1)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战