下面是:有关链表的插入操作:
首先,插入的概念是:破坏两个物体之间的联系,在两个物体之间插入第三个物体。
例如:1------->2(1与2相连),我要在中间插入3,则要先破坏链接:1---x--->2,然后1---->3----->2。
下面以uva的11988为例说明:
#include<cstdio>
#include<cstring>
const int maxn = 100000 + 5;
int last, cur, next[maxn]; // 光标位于cur号字符之后面
char s[maxn];
int main() {
while(scanf("%s", s+1) == 1) {
int n = strlen(s+1); // 输入保存在s[1], s[2]...中
last = cur = 0;
next[0] = 0;
for(int i = 1; i <= n; i++) {
char ch = s[i];
if(ch == '[') cur = 0;
else if(ch == ']') cur = last;
else {
<span style="color:#ff0000;"> next[i] = next[cur];
next[cur] = i;</span>
if(cur == last) last = i; // 更新“最后一个字符”编号
cur = i; // 移动光标
}
}
for(int i = next[0]; i != 0; i = next[i])
printf("%c", s[i]);
printf("\n");
}
return 0;
}
这里的next数组是关系数组,每一个next[i]记录着它要指向哪一个字符的位置。
这里详细说明红色字体的代码,这就是插入的概念。
两句代码是(用最上面的例子说明):先然next[3]这个关系指向next[1]所指向的关系,也就是next[2],然后再让next[1]指向next[3],从而让关系重新建立。(这里的代码有一个小技巧是:直接赋值,不需要再用一个变量存储,代码简洁)
这里的关系next[]的值是指向字符的下标。