算法学习之数据结构之双向链表

本文介绍了双向链表的数据结构,每个元素包含关键字域和两个指针域,用于指向前后节点。详细阐述了插入、搜索和删除操作,并讨论了使用哨兵简化边界条件的环形双向链表实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  双链表的没一个元素都是对象,每个对象包含一个关键字域和两个指针域(next,prev)。当然,每个对象还可能包含一些其他的卫星数据。next指向后继节点,prev指向前驱节点。如果prev[x] == null,则无前驱节点,是head头节点。如果next[x] == null则无后继节点,是最后一个节点,即尾节点tail。

  双链表的具体操作如下:
双向链表的插入:insert(L, x)
next[x]=head[L] //头插法,当前节点x的下一个节点指向头节点
if head[L] != null // 头节点不为空
    then prev[head[L]] = x //头节点的上一个节点指向x
head[L] = x //重置头节点
prev[x] = null //头节点的上一个节点置为空


搜索:
search(L, k)
x = head[L]
while x != null and key[x] != k
  do x = next[x]
return x;


删除:
delete(L, x)
if(prev[x] != null) //如果当前节点不是头节点
    then next[prev[x]] = next[x] //当前节点x的上个节点的下一个节点置为当前节点x的下一个节点
    else head[L] = next[x]  //否则头节点置为当前节点x的下一个节点
if next[x] != null
    then prev[next[x]] = prev[x] // 当前节点x的下个节点的上一个节点置为当前节点x的上一个节点


哨兵nil[L],有其他元素一样的各个域
可以简化边界条件,将双向链表变成带哨兵的环形双向链表,哨兵元素介于头和尾之间,next[nil[L]]指向头节点,prev[nil[L]]指向尾节点,同样表头的prev域和表尾的next域都指向nil[L],这样可以吧head[L]换成next[nil[L]]。

插入:
next[x] = next[nil[L]]
prev[next[nil[L]] = x
next[nil[L]] = x
prev[x] = null


删除:
next[prev[x]] = next[x]
prev[next[x]] = prev[x]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值