基于C++的数据结构-4

目录

1、循环链表介绍

2、双向链表及基本操作


1、循环链表介绍

        单向链表的指针是单方向的,很容易从一个节点出发查找它后面的节点,但如果想从某节点出发查找它前面的节点就比较困难。为克服这一缺点,将单向链表的最后一个节点指针指向头结点,这样整个链表就构成了一个循环,就形成了循环链表。此时最后一个节点的指针不再是NULL,而是指向头结点,只有头结点的循环链表叫做空循环链表。

         由于在循环链表中设置了一个头结点,因此在任何情况下,循环链表中至少有一个节点存在,从而使得空表和非空表的运算统一,提高兼容性。同时,循环链表和单向链表的实现只有很小差别,主要是将“==NULL”替换为“==head”即可。

        因此此处代码不作赘述,可查看上一篇--单向链表内容。

2、双向链表及基本操作

        对于大多数线性表的应用问题,单向链表和循环链表已经足够了。但当需要经常访问节点的前驱节点时,虽然循环链表已经能够首尾相连,从某一节点访问前面的节点比单向链表更为容易,但访问直接前驱时任然不够方便,需要转一圈,此时采用双线链表会更加简洁方便。

        双向链表的每个节点含有两个指针域,一个指向前驱节点,一个指向后继结点。如图,其中如果将头结点的指向前驱的指针指向最后一个节点,同样最后一个节点指向头结点,就构成了双向循环链表。

         双向链表的节点类C++描述模板如下:(注:因实现与单向链表相似,故不对实现做赘述)

template<class T>
class DoubleLinkNode{
    template<class T>

    friend class DoubleLinkList;    //DoubleLinkList是具体操作类,此处不作实现
                                    //友元是为了操作类可以直接访问私有成员(指针)
    private:
        T data;
        DoubleLinkNode<T> *prev, *next;
};

        由于双向链表有两个方向的指针,所以在链表上进行访问非常方便。但在双向链表上进行插入和删除操作时由于设计两个指针的重新连接问题,因此比单向链表的插入删除实现要复杂一些。同时双向链表中的指针first用来指向链表的第一个节点,指针end指向链表的最后一个节点。而双向循环链表中由于最后一个节点的next指针直接指向first,first->prev指针指向最后一个节点,所以只适用first指针即可,以节省空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值