- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机软件开发技术-数据结构3(3月28日)
二、带表头结点的单链表 表头结点位于表的最前端,本身不带数据,仅标志表头。 设置表头结点的目的是统一空表与非空表、表头和表中位置的操作形式,简化链表操作的实现。 数据元素和栈顶下标之间的对应关系 * 1 3 5 7 / head 7 5 3 1 / head 倒置前 倒置后 单链表的倒置方法 分析: 由于单链表存储空间不连续,所以顺序表中将第i个结点与第n-1-i个结点交换(i的取值范围是0到n/2-1,n为表的长度)的办法不适用于链表。单链表倒置的方法可以从第二个结点开始依次取每个结点插入到表头前面去。 具体算法: (1)令引用p指向链表的第二个结点。 1 3 5 7 / head p q (2)倒置后原首结点将成为最后一个结点,故令head.next=null null (3)让q指向p的后继,p引用的结点插到表头前,并成为新表头。 q=p.next; p.next=head; head=p; (4)p后移指向下一个结点。 p=q; (5)重复步骤(3)(4),直到p引用的结点为空。 public void reverse( ) { Node p,q; if(isEmpty()) return ; p =head.next; tail=head; head.next = null; while (p!= null) { q = p.next; p.next = head; head = p; p = q; } } 代码实现 非空表 空表 / an-1 a0 head head / 在带表头结点的单链表最前端插入新结点 newnode.next = p.next; p.next= newnode; head newnode head newnode head newnode / head newnode / p p p p 非空表 空表 插入前 newnode 插入前 插入前 插入后 插入后 q = p.next; p.next = q.next; 从带表头结点的单链表中删除最前端的结点 head head head / head / p q p q 二. 循环链表 将单链表最后一个结点的next域指向第一个结点就构成了循环链表(circular list),一般的单链表只能访问某结点后面的结点,而循环链表从任一结点出发都可以访问所有的结点.如下所示: 对于环链表: 最后一个结点的next值不再是null,而是表头指针head. 可通过检查 current.next == head来判断当前指针current是否指向最后结点; head a1 ai-1 an ai 循环链表的应用举例-----约瑟夫问题 问题描述:旅行社要从n个旅客中选出一名旅客,为其提供免费环球旅行服务.旅行社安排这些旅客围成一个圆圈,从小于n的数中随意抽出一个数m,作为报数值。游戏进行时,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人被淘汰出列,然后从他顺时针方向上的下一个人开始重新报数,如此下去,直到圆圈中只剩下一个人,这个最后的幸运者就是游戏的胜利者,将得到免费旅行的奖励。例如,若n=8,m=3,则出列顺序将为3,6,1,5,2,8,4,最初编号为7的旅客将赢得环球旅游的机会。 例如 n =8 m = 3 程序处理步骤: 1、建立环链。 通过void append(int i)方法将值为i的数据不断加到环 链的尾部. 2、选择获胜者.(假设m是报数值, n为人数) 在含有n个结点的环链中从表头开始按步长m顺时针删除n-1 个结点. 具体步骤如下: (1)当前工作引用指向表头引用:current=head (2)当前引用向后移动m-1次(通过m-1次调用以下goNext方法实现) void goNext()方法: 移动current到下一结点并保存其原值到前驱引用pr (3)current引用的结点出列并删除. int getdata()方法获取出列结点的数据, void deleteNode( )方法将current引用的结点从环链中删除. (4)重复执行(2)(3)步共n-1次.最终current指向获胜者. class Node { public int data; public
文档评论(0)