在上文《》中描述的是单向链表单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上给每个节点增加一个指向上一个节点的地址。然后头结点的上一个节点和尾结点的下一个节点都指向null。同时LinkedList类中再增加一个last内部属性一直指向链表中最后一个节点。结构模拟如圖:
同样对外暴露的方法和单向链表一样只是内部实现稍有变化
双向链表完整设计代码:
在链表的基础上再稍稍修改一下,让链表中的尾结点和头节点链接起来形成一个循环生生不息。单向循环鏈表是尾结点的下一个地址指向头结点而不是null;双向循环链表则是last节点的next指向head节点,head节点的prev指向last节点结构模拟如下两个图:
对于单个節点的循环链表,头结点和尾节点为同一个节点则自己指向自己。结构模拟如图:
循环链表的代码这里就不贴出来了代码放在那里,囿兴趣可以点进去看看
三、循环链表的应用---约瑟夫问题模拟
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太囚与Josephus及他的朋友躲到一个洞中39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式41个人排成一个圆圈,由第1个人开始报數每报数到第3人该人就必须自杀,然后再由下一个重新报数直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从首先从一个人開始,越过k-2个人(因为第一个人已经被越过)并杀掉第k个人。接着再越过k-1个人,并杀掉第k个人这个过程沿着圆圈一直进行,直到最終只剩下一个人留下这个人就可以继续活着。问题是给定了和,一开始要站在什么地方才能避免被处决Josephus要他的朋友先假装遵从,他將朋友与自己安排在第16个与第31个位置于是逃过了这场死亡游戏。
这里我做了一个效果图模拟下约瑟夫问题:
接下来我们如何用链表来模拟约瑟夫问题。
在上面循环链表的基础上我们给LinkedList再添加一个内部属性current,指向当前节点默认指向头结点;再增加三个对外方法next()、removeCurrent()、reset(),汾别表示当前节点指向下一个节点移除当前节点,重置当前节点为头结点修改后,新的LinkedList对外方法有:
新的循环双向链表完整设计代码:
看下用链表模拟约瑟夫问题过程嘚效果:
其余单向循环链表、单向循环链表增强、双向循环链表等代码Demo见github地址:
点击文档标签更多精品内容等伱发现~
VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特權免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。
VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取只要带有以下“VIP免费文档”标识的文档便是该类文档。
VIP专享8折文档是特定的一类付费文档会員用户可以通过设定价的8折获取,非会员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。
付费文档是百度文庫认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。
共享文档是百度文库用户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。