问题简述:
解析:
过程比较好想:首先建立一个双向循环链表,然后遍历每个节点,将出现的节点freq值加一,时间复杂度O(mn)。最后根据freq值对链表进行排序。
重点:
(1)创建双向循环链表;创建双向链表后
——头指针pre和尾指针next指向空为双向链表;
——头指针pre指向尾指针,尾指针next指向头指针就为双向循环链表;
(2)双向链表中交换元素顺序;先将元素取下来,然后往前找,找到插进去即可。
——取下来分两步;
——插入分四步;
代码:
#include <iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
struct LinkNode{
char value;
int freq;
LinkNode *next,*pre;
};
void Create_double_LinkList(LinkNode *head,int m,char *a)
{
LinkNode *p=head;
for(int i=0;i<m;i++)
{
LinkNode *node=new LinkNode;
node->value=a[i];
node->freq=0;
node->next=NULL;
p->next=node;
node->pre=p;
p=p->next;
}
p->next=head;
head->pre=p;
}
void Change_Freq(LinkNode *head,int n,char *chNode)
{
for(int i=0;i<n;i++)
{
LinkNode *p=head->next;
for(;p!=head;p=p->next)
{
if(p->value==chNode[i])
{
//找到该节点,先把该节点拿出来
p->freq++;
p->pre->next=p->next;
p->next->pre=p->pre;
//往前找,找到插入的位置插入即可
LinkNode *tmp=p->pre;
while(tmp->freq<p->freq)
tmp=tmp->pre;//此处由于头节点fre=999,所以不会超过头节点
//查到tmp后面即可
p->next=tmp->next;
tmp->next->pre=p;
tmp->next=p;
p->pre=tmp;
break;
}
}
}
}
int main()
{
int m,n;
cin>>m>>n;
//将输入数据先存储下来
getchar();
char a[101],chNode[101];
for(int i=0;i<m;i++)
{
cin>>a[i];
getchar();
}
for(int i=0;i<n;i++)
{
cin>>chNode[i];
getchar();
}
//创建头节点
LinkNode *head=NULL;
head=new LinkNode;
head->next=NULL;
head->pre=NULL;
head->value=0;
head->freq=999;//这里很重要,用来截住比较
//创建双向循环链表
Create_double_LinkList(head,m,a);
//改变freq值
Change_Freq(head,n,chNode);
LinkNode *p=head->next;
while(p!=head)
{
cout<<p->value<<" ";
p=p->next;
}
free(p);
return 0;
}
总结:
注意双向链表以及双向循环链表的创建,以及双向链表的的插入元素操作四步骤。