【双向链表】 hdu4286 Data Handler

Data Handler

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4286

题意:给你一个数字串和一些操作指令,问你执行完操作后的数字串是什么。

题解:双向链表模拟。就是要判断第i个结点的前后结点分别是什么比较困难,这个问题可以通过给左指针前1位加个指针,右指针后1位加个指针解决。

ps:打代码一定要细心,特别是这种模拟题。T^T

代码:

#include<cstdio>
#include<cstring>
using namespace std;
struct node
{
    int value;
    int pre,next;
} num[1000005];
int l,ll,r,rr,cnt;
void MoveLefe()
{
    char ch[5];
    scanf("%s",ch);
    if(ch[0]=='L')
    {
        if(num[ll].pre==l)
        {
            l=ll;
            ll=num[ll].next;
        }
        else
        {
            l=ll;
            ll=num[ll].pre;
        }
    }
    else
    {
        if(num[r].pre==rr)
        {
            rr=r;
            r=num[r].next;
        }
        else
        {
            rr=r;
            r=num[r].pre;
        }
    }
}
void MoveRight()
{
    char ch[5];
    scanf("%s",ch);
    if(ch[0]=='L')
    {
        if(num[l].pre==ll)
        {
            ll=l;
            l=num[l].next;
        }
        else
        {
            ll=l;
            l=num[l].pre;
        }
    }
    else
    {
        if(num[rr].pre==r)
        {
            r=rr;
            rr=num[rr].next;
        }
        else
        {
            r=rr;
            rr=num[rr].pre;
        }
    }
}
void Insert()
{
    char ch[5];
    int value;
    scanf("%s%d",ch,&value);
    if(ch[0]=='L')
    {
        num[cnt].pre=ll;
        num[cnt].next=l;
        if(num[ll].pre==l) num[ll].pre=cnt;
        else               num[ll].next=cnt;
        if(num[l].pre==ll) num[l].pre=cnt;
        else               num[l].next=cnt;
        l=cnt++;
        num[l].value=value;
    }
    else
    {
        num[cnt].pre=rr;
        num[cnt].next=r;
        if(num[rr].pre==r) num[rr].pre=cnt;
        else               num[rr].next=cnt;
        if(num[r].pre==rr) num[r].pre=cnt;
        else               num[r].next=cnt;
        r=cnt++;
        num[r].value=value;
    }
}
void Delete()
{
    char ch[5];
    int next;
    scanf("%s",ch);
    if(ch[0]=='L')
    {
        if(num[l].pre==ll) next=num[l].next;
        else               next=num[l].pre;
        if(num[ll].pre==l)  num[ll].pre=next;
        else               num[ll].next=next;
        if(num[next].pre==l) num[next].pre=ll;
        else                 num[next].next=ll;
        l=next;
    }
    else
    {
        if(num[r].pre==rr) next=num[r].next;
        else               next=num[r].pre;
        if(num[rr].pre==r)  num[rr].pre=next;
        else               num[rr].next=next;
        if(num[next].pre==r) num[next].pre=rr;
        else                 num[next].next=rr;
        r=next;
    }
}
void Reverse()
{
    if(num[r].pre==rr) num[r].pre=ll;
    else               num[r].next=ll;
    if(num[l].pre==ll) num[l].pre=rr;
    else               num[l].next=rr;
    if(num[ll].pre==l) num[ll].pre=r;
    else               num[ll].next=r;
    if(num[rr].pre==r) num[rr].pre=l;
    else               num[rr].next=l;
    l=l^r;
    r=l^r;
    l=l^r;
}
void out(int n)
{
    bool first=true;
    int pre=0;
    for(int i=num[0].next;i!=n+1;)
    {
        if(first)
        {
            printf("%d",num[i].value);
            first=false;
        }
        else printf(" %d",num[i].value);
        if(num[i].next!=pre)
        {
            pre=i;
            i=num[i].next;
        }
        else
        {
            pre=i;
            i=num[i].pre;
        }
    }
    printf("\n");
}
int main()
{
    int cas,n,m;
    char s[20];
    scanf("%d",&cas);
    for(; cas--;)
    {
        scanf("%d",&n);
        cnt=n+2;
        for(int i=1; i<=n; ++i)
        {
            scanf("%d",&num[i].value);
            num[i].pre=i-1;
            num[i].next=i+1;
        }
        scanf("%d%d",&l,&r);
        num[0].pre=0;
        num[0].next=1;
        num[n+1].pre=n;
        ll=num[l].pre;
        rr=num[r].next;
        scanf("%d",&m);
        for(; m--;)
        {
            scanf("%s",s);
            if(strcmp(s,"MoveLeft")==0)
                MoveLefe();
            else if(strcmp(s,"MoveRight")==0)
                MoveRight();
            else if(strcmp(s,"Insert")==0)
                Insert();
            else if(strcmp(s,"Delete")==0)
                Delete();
            else if(strcmp(s,"Reverse")==0)
                Reverse();
        }
        out(n);
    }
    return 0;
}

来源: http://blog.csdn.net/acm_ted/article/details/7961812

你可能感兴趣的:(【双向链表】 hdu4286 Data Handler)