《大话数据结构》

循环链表

在座的各位都很年轻,不会觉得日月如梭。可上了点年纪的人,比如我—的父辈们,就常常感慨,要是可以回到从前该多好二网上一也盛传,所谓的成功男人就是3岁时不尿裤子,5岁能自己吃饭......80岁能自已做饭,90岁能不尿裤子。对于单链表,山于每个结点只存储了向后的指针、到了尾标志就停止了向后链的操作,这样,当中某一结点就无法找到它的前驱结点了,就像我们刚才说的,不能回到从前。比如,你是一业务员,家在上海。需要经常出差,行程就是上海到北京一路上的城市,找客户谈生意或分公司办理业务。你从_丘海出发,乘火车路经多城市停留后,再乘飞机返回上海,以后,每隔一段时I'}EJ,你基本还要按照这样的行程开展业务。


有一次,你先到南京开会,接下来要对以匕的城市走,遍,此时有人对你i}. ,不行,你得从上海开始,因为上海是第一站。你会对这人说什么?神经病。哪有这么傻的,直接回上海根本没有必要,你可以从南京开始。下一站蚌埠,直到北京,之后#}i-考虑走完上海及苏南的几个城市。}.然这表示你是从当中一结点开始遍历整个链表,这都是原来的单链表结构解决不了的l[q题:事实上,把北京和上海之间连起来,形)」戈一个环就解决了前面所面临的困难。这就是我们现在要讲的循环链表。将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linkedlist)。从刚才的例子,可以总结出,循环链表解决r一个很麻烦的问题。如何从’}I中一个结点出发,访} rrl到链表的全部结L} f}}}.二为了使空链表与非空链表处理一致,我们通常设一个头结点,当然,这并不是说,循环链表一定要头结点,这需要注意,循环链表带有头结点的空链表。


对于非空的循环链表如下图:


其实循环链表和单链表的主要差舜就在于循环的判断条件上,原来是判断p->next是否为空,现在则是P一>next不等丁头结点,则循环末结束。在单链表中,我们有了头结点}}寸,我们可以用}[1)的时间访IRI一个结点,但对T}i}}问到最后一个结点,却需要Q[r:)时间,因为我们需要将单链表全部扫描一遍。有没有可能用。[x)的时间由链表指针访问到最后一个结点呢?当然可以。不过我们需要改造一下这个循环链表,不用头指针,而是用指向终端结点的尾指




从下图中可以看到,终端结点用尾指针rear指示,则查找终端结点是以}}s而开始r f:点,其实就是rear->next 5next,其时间复杂也为D[1)}举个程序的例子,要将两个循环链表合并成一个表时,有了尾指针就非常简单了。比如下面的这两个循环链表,它们的尾指针分别是rearA和rearB 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值