《王道》第11章 链表之双链表
目录
1.双链表的插入(以插入到p结点前为例)
第一步:首先找到插入位置,节点 s 将插入到节点 p 之前
第二步:将节点 s 的前驱指向节点 p 的前驱,即 s->prior = p->prior;
第三步:将节点 p 的前驱的后继指向节点 s 即 p->prior->next = s;
第四步:将节点 s 的后继指向节点 p 即 s->next = p;
第五步:将节点 p 的前驱指向节点 s 即 p->prior = s;
2.双链表的删除
第一步:找到即将被删除的节点 p
第二步:将 p 的前驱的后继指向 p 的后继,即 p->prior->next = p->next;
第三步:将 p 的后继的前驱指向 p 的前驱,即 p->next->prior = p->prior;
第四步:删除节点 p 即 delete p;
3.代码
4.补充
在有序双向链表中,定位删除一个元素的平均时间复杂度为O(n)。
解析:因为链表不支持随机存取,故元素查找需要顺序查找,时间复杂度为O(n),删除操作时间复杂度为O(1)。
若某链表最常用的操作是在最后一个结点之后插入一个结点和删除最后一个结点,则采用带头结点的双向循环链表存储最节省时间。
解析:在最后一个结点之后插入结点,需要快速定位尾结点,删除最后一个结点,需要快速定位尾结点的前一个结点。A带头结点的双循环链表可通过头结点的prior指针访问尾结点,且由于是双循环链表,故可通过尾结点访问尾结点的前一结点。