題目鏈接:1025 反轉鏈表 (25分)
題目
解題思路
先心態爆炸一會
- 這題真的把我心態弄得特別崩了。一開始用
map<string, pair<int, string>>
存原數據,vector 存個按順序的地址,不行,樣例過了一直不過。- 後來有
我就不說了的博客說有可能有的節點不在鏈表裏。。。我就信了,然後加了個 set 最後遍歷一遍輸出沒有在鏈表裏的節點。- 我複製一個莫名其妙的代碼,AC 了,從此忘了愛,做別的題不香嗎???
- 能做的題都做完了,我回來了,我是來談條件的!從頭寫,哈哈哈,真快樂。欸吖錯了,錯了錯了錯了錯了錯了,啊啊啊啊啊啊啊
- 差點就被心魔奪取了理智,冷靜。哦原來要
每 K 個結點
都反轉啊 - 嘟 - 嘟 - 嘟 - 我好了 submit ~ TLE ???- 於是又去網上找別人的博客,怎麼感覺還是看不懂。絕望到最後,決定直接按順序存到 vector 裏然後一段一段反轉好了。。。
我過了,莫名其妙的過了
- 只要從頭結點開始遍歷,按順序存進
vector
- 然後跳躍遍歷,把能反轉的段都用
<algorithm> 裏的 recerse() 函數
反轉一下 - 不用考慮什麼
不在鏈表上的點
反轉完了按順序輸出就行了
注意:
- 輸出的時候,不能用節點的
next
因爲順序打亂了以後結構體裏的順序並沒有變 - 所以輸出的地址是
當前地址
;數據是當前數據
;next 地址是下一個節點的當前地址
- 總之就是先輸出第一個節點的
地址和數據
然後循環輸出地址,回車,地址和數據,不回車
最後輸出-1,回車
代碼
#include <iostream>
using namespace std;
#include <map>
#include <vector>
#include <algorithm>
struct P {
int d;
string t, n;
};
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string b; int s, k;
cin >> b >> s >> k;
map<string, P> m;
for (int i = 1; i <= s; i++) {
string t, n; int d;
cin >> t >> d >> n;
P p = {d, t, n};
m[t] = p;
}
int l = 0;
vector<P> v;
while (b != "-1") v.push_back(m[b]), b = m[b].n, l += 1;
for (int i = 0; i + k <= l; i += k)
reverse(v.begin() + i, v.begin() + (i + k));
cout << v[0].t << ' ' << v[0].d << ' ';
for (int i = 1; i < l; i += 1)
cout << v[i].t << endl << v[i].t << ' ' << v[i].d << ' ';
cout << "-1" << endl;
return 0;
}
請多多支持猹的個人博客 H_On 個人小站
因爲猹的小站真的還挺可的,所以那邊更新的也比較勤奮,感謝關注~我會努力的(ง •_•)ง