一道链表题目的思考
2016-04-21 14:33
453 查看
【题目说明】设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向先驱结点的指针prior、指向后继
结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0.每当在链表上进行一次
L.Locate(x)操纵时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点
后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【题目分析】根据题意,需要先找到该值为x的结点,然后结点频度freq+1,再将该结点向前移动,插入到合适的位
置中去。
【JAVA代码分析】
结点的指针next、存放数据的成员data和访问频度freq。所有结点的freq初始时都为0.每当在链表上进行一次
L.Locate(x)操纵时,令元素值x的结点的访问频度freq加1,并将该结点前移,链接到现它的访问频度相等的结点
后面,使得链表中所有结点保持按访问频度递减的顺序排列,以使频繁访问的结点总是靠近表头。
【题目分析】根据题意,需要先找到该值为x的结点,然后结点频度freq+1,再将该结点向前移动,插入到合适的位
置中去。
【JAVA代码分析】
public class LinkNode{ LinkNode prior=null;//前驱指针 LinkNode next=null;//后驱指针 int data; int freq; public LinkNode(int data,int freq){ this.data=data; this.freq=freq; } } public void Locate(LinkNode first,int x){ LinkNode p=first.next; while(p!=first&&p.data!=x){ p=p.next; } if(p!=first){ p.freq++; LinkNode cur=p; //移除cur结点,插入到合适位置 cur.prior.next=cur.next; cur.next.prior=cur.prior; p=cur.prior; //cur结点处值大于p结点处,p.prior--->p while(p!=first&&p.data<cur.data){ p=p.prior; } //cur结点插入到p结点后面 //cur的前继和后继 cur.next=p.next; cur.prior=p; //p的后继p.next的前继 p.next.prior=cur; p.next=cur; } else System.out.println("not found such node"); }
相关文章推荐
- 点击页面判断是否安装app并打开,否则跳转app store的方法
- 基于bootstrap的日期插件bootstrap-datetimepicker
- Cocoapods安装和使用
- 选择相册图片,修改部分机型错误,4.4以上版本
- 动态绑定AJAX,获取下级分类并延迟执行
- R语言学习5数学函数
- js中获取一个对象里面的方法和属性的javascript
- Find the maximum by binary search
- Cisco VPP(5) node关系图
- 目前最热门的60本计算机图书--2011 [转]
- Linux内核抢占机制介绍与研究
- max-Queue(堆)
- 常见算法是js实现汇总
- android studio build cpu 99%运行问题
- [C#]读文件
- I.MX6 Ethernet UI patch failed
- 棱镜
- break在括号中失效问题
- [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects)
- Android中HTTPS应用开发--HTTPS介绍