数据结构与算法--双向链表
双向链表
为什么要讨论双向链表
-
单链表的结点有指向后继的指针域,找后继节点方便(找后继节点的时间复杂度是O(1))
-
单链表没有指向前驱结点的指针域,找前驱结点必须再次从表头出发(时间复杂度是O(n))
-
双向链表:在单链表的每个结点里面再增加一个指向直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表
双向链表的结构可定义如下:
typedef struct DuLNode{ Elemtype data; struct DuLNode *prior,*next; }DuLNode,*DuLinkList;
双向循环链表
和单链的循环表类似,双向链表也可以有循环表
- 让头结点的前驱指针指向链表的最后一个结点
- 让最后一个结点的后继指针指向头结点
双向链表结构的对称性(设指针p指向某一结点):
p->prior->next=p=p->next->prior
双向链表中的操作(如ListLength\GetElem等)和线性链表相同。但是再插入、删除的时候,需要同时修改两个方向的指针,两者操作的时间复杂度均为O(n).
【算法】双链表的删除
- 关键步骤
-
1.p->prior->next=p->next; 2.p->next->prior=p->prior;
void ListDelete_Dul(DuLink &L,int i,Elemtype &e){
//删除带头结点的双向链表L的第i个元素,并用e返回
if(!(p=GetElemP_DuL(L,i))) return ERROR;
e = p->data;
p->prior->next = p->next;
p->next->prior=p->prior;
free(p);
return OK;
}//ListDelete_Dul
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix