stl中的list是雙向鏈表,優點在于插入/刪除元素方便,缺點是隨機訪問元素時間長
所需頭文件:#include <list>
初始化
list<類型名> 變量名
定義一個int類型的變量a
list<int> a;
在末尾插入元素
a.push_back(i);
在開頭插入元素
a.push_front(0);
刪除末尾元素
a.pop_back();
刪除開頭元素
a.pop_front();
遍歷(迭代器)
list<int>::iterator it;
for (it = a.begin(); it != a.end(); it++) {cout << *it << endl;
}
插入指定位置的元素
list<int>::iterator it_2 = a.begin();
int n = 3;
advance(it_2, n - 1); // 移動到第n個元素的位置
a.insert(it_2, 70); // 在指定位置插入元素
刪除指定位置的元素
list<int>::iterator it_3 = a.begin();
int n_2 = 6;
advance(it_3, n_2 - 1); // 移動到第n個元素的位置
a.erase(it_3); // 在指定位置插入元素
獲取鏈表大小
a.size();
清空鏈表
a.clear();
入門題目:hdu 1276 “士兵隊列訓練問題”
解題代碼來源于《算法競賽:入門到進階》
問題描述
某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,并排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以后從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
輸入
本題有多個測試數據組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
輸出
共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
輸入示例
2
20
40
輸出示例
1 7 19
1 19 37
解題思路:
先確定數據結構,我們發現刪除操作較多,決定使用list鏈表。先將原有的索引值作為值存儲到鏈表中,然后每次刪除鏈表的結點,最后剩下的鏈表中存儲的值就是原有的士兵位置
#include <bits/stdc++.h>
using namespace std;int main() {int t, n;cin >> t;while (t--) {cin >> n;int k = 2;list<int> mylist;list<int>::iterator it;for (int i = 1; i <= n; i++) {mylist.push_back(i);}while (mylist.size() > 3) {int num = 1;for (it = mylist.begin(); it != mylist.end();) {if (num++ % k == 0) {it = mylist.erase(it);} else {it++;}}k == 2 ? k = 3 : k = 2;}for (it = mylist.begin(); it != mylist.end(); it++) {if (it != mylist.begin()) {cout << " ";}cout << *it;}cout << endl;}return 0;
}