您的位置:首页 > 其它

UVA 11988 链表

2016-05-10 20:42 211 查看
之前遇到字典树什么的要不就用指针链表,要不直接上list。

数组链表主要思想和指针差不多。

指针是用*next记录下一个的地址然后形成链。

数组本身开辟空间时便是一个地址所以也可以达到这点。

比如 int a[11];     a[0]=1;   a[1]=2;  a[2]=4; a[4]=3;
a[a[0]]=a[1]=2这样就达到了将 1 2 4 3 接到一起。

仔细分析一下数组a的下标再不断增大,但是记录的数据却在更新。

所以可以大致写出

int next[11];  

int now=0;     //光标

for(int i=1;i<=n;i++)

{

       next[i]=next[now];   //   更新数据

       next[now]=i;    // 记录位置

       now++;    //光标移动

}

不同题目光标跳动方式不同,现在上例题

小紫书UVA 11988

题目大意输入一串字符(空格用'_'代替)其中字符‘[’表示HOME建(光标移到最前面)  字符 ']' 表示END键(光标移到最后)  输出运行后的字符串(长度100000);

样例输入   This_is_a_[Beiju]_text

样例输出   BeijuThis_is_a_text

拿到题目如果字符串长度小的话可以直接暴力模拟。

不过字符串长为100000的话如果插入一个数到最前面后面的都要往后移动这样时间量就大了(系统不想跟你说话同时丢给你一个TLE)

所以要用到链表

不同的是光标可能跳到最前面或者最后面所以要设一个变量记录当前最后的位置

代码如下

#include<stdio.h>

#include<string.h>

#define Max 100000

int main()

{
char s[Max+5];
int next[Max+5];
int now;
while(~scanf("%s",s+1))         //从第1位开始保留0位作为起始
{
    memset(next,0,sizeof(next));
    int i,ed=0;                             //设置当前最后位置为0
   now=0;                                  //初始化光标

       for(i=1;i<=strlen(s+1);i++)
  {
if(a[i]=='[')  now=0;            //光标移至最前
else if(a[i]==']')  now=ed;  //光标移至最后
else {
next[i]=next[now];         //更新next数组
next[now]=i;                
if(ed==now) ed=i;     //更新末位
now=i;                      //更新光标
  }
for(i=next[0];i!=0;i=next[i])
printf("%c",s[i]);
printf("\n");
]

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表 算法