鏈表的思想很簡單,要做到活用也不難。一般我是這樣做得,從實際問題出發(fā),先高度的概括符不符合鏈表的特點。能不能用鏈表簡單解決。接著,就是編碼。
鏈表編碼要理清細節(jié)性思路,最好是簡單的畫下圖,正如改題的鏈表,本質(zhì)上是循環(huán)鏈表。last指向最后一個節(jié)點。其next指針一定指向頭節(jié)點。我們把s[0]當做頭節(jié)點。
1
2 #include <cstdio>
3 #include <cstring>
4 const int maxn = 100000 + 5;
5 int last, cur, next[maxn];
6 char s[maxn];
7 int main() {
8
9 while ( scanf("%s", s + 1) == 1) {
10
11 int n = strlen(s + 1);
12 last = cur = 0;
13 next[0] = 0; // 頭結(jié)點初始化指向自身
14
15 for (int i = 1; i <=n; i++) {
16
17 char ch = s[i];
18 if ('[' == ch ) cur = 0;
19 else if (']' == ch) cur = last;
20 else {
21
22 next[i] = next[cur]; // next[cur]為當前光標的前一個字符,而next[i]就是當前光標要輸入的字符,接著,光標還要跳到下個字符。所以我們要把當前字符next指向光標輸入的字符。也就是next[cur] = i;但要先保存其next指針給輸入字符。其next指針其實就是真相頭結(jié)點。
23 next[cur] = i;
24 if (cur == last) last = i;
25 cur = i; // 指向下一個節(jié)點
26 }
27
28 }
29
30 for (int i = next[0];i != 0; i = next[i]) {
31 printf("%c", s[i]);
32 }
33 puts("");
34 }
35
36 return 0;
37 }
2015/4/12上午12:10:12