链表有2个储存单位,一个是数据存储单位value[maxn],一个是指示存储单位next[maxn],数据存储单位保存值,而next存储数据的顺序,每个next中存储的值即是下一个值所对应的next[i]中i的值,i的值对应value中数据的存储位置。

示例代码如下:

#include<cstdio>
#include<cstring>
const int maxn=100005;
char s[maxn]= {0}; ///储存输入文本
int cur,last,next[maxn]= {0}; ///记录文本位置
int main()
{
    while(~scanf("%s",s+1))
    {
        int n=strlen(s+1);
        last=cur=0;
        next[0]=0;///给所有位置初始化
        for(int i=1; i<=n; i++)
        {
            char ch=s[i];
            if(ch=='[')
                cur=0;///如果是[,则将光标调到0,进行位置交换
            else if(ch==']')
                cur=last;///如果是],则光标移动到最后
            else
            {
                printf("%d ",next[i]);
                printf("%c %c\n",s[next[i]],s[next[cur]]);
                next[i]=next[cur];///当cur==0时,第i个数和第0位的数交换位置,此时next[i]=0,之后由于有cur=i,所以此式中next[cur]恒为0
                next[cur]=i;
                printf("%d ",next[i]);
                printf("%c %c\n",s[next[i]],s[next[cur]]);
                if(cur==last)///当cur==last时,由于先前的空格被推到了第i位,后面交换则是跟第i位数交换
                    last=i;
                cur=i;
            }
        }
        for(int i=next[0]; i!=0; i=next[i]) ///通过链表输出,经过替换之后,s[0]存储的是]
            printf("%c",s[i]);
        printf("\n");
    }
    return 0;
}