python进阶之数据结构与算法--入门-双向链表

双向链表: 

        在单向链表中,每个节点为其后继节点维护一个引用。之前强调过可以在单向链表的任意位置插入一个节点,也可以在链表的开头处轻松删除一个节点。但是不能有效地删除链表结尾的节点。更一般地说,我们不好通过某个节点的引用而去直接删除该节点,因为其节点的前驱节点并不好确定。所以单向链表有比较明显的不对称性,每次只能通过头节点向后的遍历找到要删除的节点的前驱节点,这样非常不方便且耗时。 

       为了更好的对称性,我们定义了一个链表,每个节点都维护了指向其前驱节点以及后继节点的引用,这种结构被称为双向链表。引入prev作为前驱节点的引用。

头哨兵和尾哨兵

      在操作接近一个双线链表的边界时,为了避免一些特殊情况,在立案表的两端都追加节点是很有用处的:在立案表的其实位置添加头节点(header),在链表结尾处添加尾节点(tailer) ,这些特定的节点称之为哨兵(或者保安)。这些节点中不存储任何主序列的元素。如图:

     在使用哨兵时,一张空链表是需要初始化的,将头节点的next指向尾节点,并且将尾节点的prev指向头节点。对于一个非空的链表,链表的header.next指向一个真正存储了元素的节点 ,对应的tailer.prev指向链表中最后一个包含元素的节点

双向列表的插入和删除

        添加元素:每次添加都发生在已知的节点当中,当一个新节点被插入在链表头部时,可以看做是插入在头哨兵和哨兵之后一个节点之间。

       删除元素:很简单,在有哨兵的情况下删除任何节点的操作都变的很简单,即将要删除节点左右两端的节点相连即可。这样一来,被删除的节点将不会是链表中的一员,被系统回收资源。

双向链表的基本实现

  

利用双向链表实现双端队列

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白piao

创作不易,支持一下!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值