03.双向链表(五)

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

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

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

03.双向链表(五)

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

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

  1. 插入

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

03.双向链表(五)

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. 删除

03.双向链表(五)

p.prior.next = p.next # 把p.next赋值给p.prior的后继,如图1
p.next.prior = p.prior # 把p.prior赋值给p.next的前驱,如图2
free(p) # 释放结点
上一篇:论文解读《Learning Deep CNN Denoiser Prior for Image Restoration》


下一篇:双向链表实现