【一敗塗地】1025 反轉鏈表 (25分)

題目鏈接:1025 反轉鏈表 (25分)

題目

在這裏插入圖片描述

解題思路

先心態爆炸一會

  • 這題真的把我心態弄得特別崩了。一開始用 map<string, pair<int, string>> 存原數據,vector 存個按順序的地址,不行,樣例過了一直不過。
  • 後來有我就不說了的博客說有可能有的節點不在鏈表裏。。。我就信了,然後加了個 set 最後遍歷一遍輸出沒有在鏈表裏的節點。
  • 我複製一個莫名其妙的代碼,AC 了,從此忘了愛,做別的題不香嗎???
  • 能做的題都做完了,我回來了,我是來談條件的!從頭寫,哈哈哈,真快樂。欸吖錯了,錯了錯了錯了錯了錯了,啊啊啊啊啊啊啊
  • 差點就被心魔奪取了理智,冷靜。哦原來要 每 K 個結點 都反轉啊 - 嘟 - 嘟 - 嘟 - 我好了 submit ~ TLE ???
  • 於是又去網上找別人的博客,怎麼感覺還是看不懂。絕望到最後,決定直接按順序存到 vector 裏然後一段一段反轉好了。。。

我過了,莫名其妙的過了

  1. 只要從頭結點開始遍歷,按順序存進 vector
  2. 然後跳躍遍歷,把能反轉的段都用 <algorithm> 裏的 recerse() 函數 反轉一下
  3. 不用考慮什麼 不在鏈表上的點 反轉完了按順序輸出就行了

注意:

  • 輸出的時候,不能用節點的 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 個人小站
因爲猹的小站真的還挺可的,所以那邊更新的也比較勤奮,感謝關注~我會努力的(ง •_•)ง

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章