双链表

单链表结点中只有一个指向其后继指针,使得单链表只能从头结点依次顺序的向后遍历。要访问某个节点的前驱结点(插入、删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)

为了克服单链表上的上述缺点,引入了双链表,双链表结点中有两个指针prior和next,分别指向其前驱结点和后继结点

双链表中结点类型描述如下:

typedef struct DNode{
	//定义双链表的结点类型
	ElemType data;//数据域
	struct DNode *prior,*next;//前驱和后继指针 
}DNode,*DLinklist;

双链表仅在单链表的定义上增加了一个前驱指针prior,因此在双链表中执行按值查找和按位查找的操作与在单链表中相同。但双链表在插入和删除操作的实现上,与单链表有着较大的不同,这是因为“链”变化时也需要对prior指针做出修改,其关键是保证在修改的过程中不断链,此外,双链表还可以很方便的找到其前驱结点,因此,插入、删除结点的算法时间复杂度仅为O(1)

双链表的插入操作

在双链表中p所指的结点之后插入结点*s

插入操作的代码如下:

s->next=p->next;//将结点的*s插入到结点*p之后
p->next->prior=s;
s->prior=p;
p->next=s; 

双链表的删除操作

删除双链表中结点*p的后继节点*q;

删除操作的代码片段如下:

p->next=q->next;
q->next->prior=p;
free(q);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值