一、双向链表
1.双向链表的结点结构
typedef struct DualNode{
ElemType data;
struct DualNode *prior; // 前驱结点
struct DualNode *next; // 后继结点
}DualNode, *DuLinkList;
如图所示:
2.双向循环链表
既然存在单循环链表,那么双向链表也存在循环链表:
3.双向链表的插入操作
插入操作其实很简单,但是要注意顺序,不能写反,如图所示:
通过上图,我们看看插入操作的实现步骤:
- 1,s->next = p;
- 2,s->prior = p->prior;
- 3,p->prior->next = s;
- 4,p->prior = s;
注意:在交换的过程中不要出现矛盾,例如第4步如果先被执行了,那么p->prior就会提前变成s,使得插入操作出错。
4.双向链表的删除操作
如图所示:
通过上图,我们看看删除操作的实现步骤:
- 1,p->prior->next = p->next;
- 2,p->next ->prior = p->prior;
- 3,free(p);
总结一下:
- 双向链表对于单循环链表来说,是要更复杂一点,每个结点多了一个prior指针(多耗点内存空间),对于插入和删除操作的顺序大家格外注意;
- 但是,双向链表可以有效提高算法的时间性能,简单说就是用空间来换取时间。
本文为原创文章,如果对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!