您的位置:首页 > 其它

一道链表题目的思考

2016-04-21 14:33 453 查看
【题目说明】设有一个带表头结点的双向循环链表L,每个结点有4个数据成员:指向先驱结点的指针prior、指向后继

结点的指针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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: