双向链表
单链表寻找某结点的前驱结点时,必须遍历一遍链表,最坏的时间复杂度 O ( n ) O(n)O(n)
而双向链表可以直接寻找某结点的前驱结点
1.双向链表的某结点
用指向某结点的指针p代表该结点
结点p的后继的前驱等于结点p本身
结点p的前驱的后继等于结点p本身
p = p->prior->next
p = p->next->prior
2.非空的带头结点的双向链表
3.双向链表中元素的插入操作
插入操作图解分步:
第一步:
s->prior = p; //将p(指向结点的指针)赋值给s的前驱
第二步:
s->next = p->next; //将p->next所指的结点,用s->next代替它指向这个结点
第三步
p->next->prior = s; //将指向数据元素为e的结点的指针s,现在用p->next->prior代替s指向此结点
第四步
p->next = s; //用p->next代替s指向数据元素为e的结点
最终实现在双向链表插入元素操作
4.双向链表中元素的删除操作
目标:删除数据元素为ai的结点
第一步:
p->prior->next = p->next; //将 p->next 指向的结点,现在用 p->prior->next 指向此结点
第二步
p->next->prior = p->prior; //将 p->prior 所指的结点,现用 p->next->prior代替其指向该结点
第三步
free(p); //释放指针p(相当于释放p所指向的结点)
最终实现了在双向链表中删除元素: