03.双向链表(五)

在单链表中,有了next指针,这就使得我们要查找下一结点的时间复杂度为O(1)。可是如果我们要查找的是上一结点,那最坏时间复杂度就是O(n)。因为我们每次都要从头开始遍历查找。

为了克服单向性这一缺点,设计双向链表,即设置一个指向其前驱结点的指针域。

既然单链表也可以有循环链表,那么双向链表当然也可以是循环表。

在这里插入图片描述

p.next.prior = p = p.prior.next

双向链表的许多操作是和单链表相同的,比如求长度的ListLength,查找元素的GetElem,获得元素位置的LocateElem等,这些操作只要涉及一个方向的指针即可,另一指针多了也不能提供什么帮助。

  1. 插入

    先搞定s的前驱和后继,在搞定后结点的前驱,最后解决前结点的后继

在这里插入图片描述

s.prior = p # 把p赋值给s的前驱,如图中1
s.next = p.next # 把p.next赋值给s的后继,如图中2
p.next.prior = s # 把s赋值给p.next的前驱,如图3
p.next = s # 把s赋值给p的后继,如图中4
  1. 删除

在这里插入图片描述

p.prior.next = p.next # 把p.next赋值给p.prior的后继,如图1
p.next.prior = p.prior # 把p.prior赋值给p.next的前驱,如图2
free(p) # 释放结点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值