AB9. 【模板】链表
描述
请你实现一个链表。输入描述
第一行输入一个整数输出描述
输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出"NULL"(不含引号)。示例1
输入:
5 insert 0 1 insert 0 3 insert 1 2 insert 3 4 delete 4
输出:
2 1 3
C++ 解法, 执行用时: 19ms, 内存消耗: 1192KB, 提交时间: 2022-06-05
#include<iostream> #include<unordered_map> using namespace std; struct Node{ int val; Node *prev; Node *next; Node(int val){ this->val = val; this->next = nullptr; this->prev = nullptr; } }; int main(){ Node *head = new Node(-1); Node *tail = new Node(-1); head->next = tail; tail->prev = head; unordered_map<int, Node*> mp; // iterator,键值对,前面是值后面是地址 int n; cin >> n; string s; int num1, num2; while(n--){ cin >> s; if(s == "insert"){ cin >> num1 >> num2; Node *node = new Node(num2); mp[num2] = node; Node *after; if(!mp.count(num1)){ after = tail; } else after = mp[num1]; after->prev->next = node; node->prev = after->prev; node->next = after; after->prev = node; } else { int num; cin >> num; if(mp.count(num)){ Node *node = mp[num]; node->prev->next = node->next; node->next->prev = node->prev; free(node); mp.erase(num); } } } if(head->next == tail){ cout<< "NULL" << endl; } else { while(head->next != tail){ cout<< head->next->val << " "; head = head->next; } cout << endl; } return 0; }
C++ 解法, 执行用时: 20ms, 内存消耗: 1204KB, 提交时间: 2022-05-04
#include<iostream> #include<unordered_map> using namespace std; struct Node{ int val; Node *prev; Node *next; Node(int val){ this->val = val; this->next = nullptr; this->prev = nullptr; } }; int main(){ Node *head = new Node(-1); Node *tail = new Node(-1); head->next = tail; tail->prev = head; unordered_map<int, Node*> mp; int n; cin >> n; string s; int num1, num2; while(n--){ cin >> s; if(s == "insert"){ cin >> num1 >> num2; Node *node = new Node(num2); mp[num2] = node; Node *after; // mp不存在num1时 if(!mp.count(num1)){ after = tail; } else { after = mp[num1]; } after->prev->next = node; node->prev = after->prev; node->next = after; after->prev = node; } else { int num; cin >> num; if(mp.count(num)){ Node *node = mp[num]; node->prev->next = node->next; node->next->prev = node->prev; node = nullptr; mp.erase(num); } } } if(head->next == tail){ cout<< "NULL" << endl; } else { while(head->next != tail){ cout<< head->next->val << " "; head = head->next; } cout << endl; } return 0; }
C++ 解法, 执行用时: 21ms, 内存消耗: 1204KB, 提交时间: 2022-03-25
#include<iostream> #include<unordered_map> using namespace std; struct Node{ int val; Node* next; Node* prev; Node(int v):val(v), next(nullptr),prev(nullptr){} }; int main(){ Node* head = new Node(-1); Node* tail = new Node(-1); head->next =tail; tail->prev = head; unordered_map<int, Node*> map; int n ; cin >> n; string s;int num1, num2; while(n --){ cin >> s; if(s == "insert"){ cin >> num1 >> num2; Node* node = new Node(num2); map[num2] = node; Node* after; if(!map.count(num1)){ after = tail; }else after = map[num1]; after->prev->next = node; node->prev = after->prev; node->next = after; after->prev = node; }else{ int num; cin >> num; if(map.count(num)){ Node* node = map[num]; node->prev->next = node->next; node->next->prev = node->prev; node = nullptr; map.erase(num); } } } if(head->next == tail) cout << "NULL"<<endl; else{ while(head->next != tail){ cout << head->next->val << " "; head = head->next; } cout <<endl; } return 0; }
C++ 解法, 执行用时: 22ms, 内存消耗: 640KB, 提交时间: 2022-07-26
#include <iostream> #include <vector> #include <cstring> #include <algorithm> using namespace std; vector<int> v; vector<int>::iterator it; int main(){ int n; char ch[10]; int x, y; scanf("%d", &n); while(n--){ scanf("%s", ch); if(ch[0] == 'i'){ scanf("%d%d", &x, &y); it = find(v.begin(), v.end(), x); v.insert(it, y); } else{ scanf("%d", &x); it = find(v.begin(), v.end(), x); if(it != v.end()) v.erase(it); } } if(v.size() > 0)for(int i = 0; i < v.size(); i++) printf("%d ", v[i]); else printf("NULL"); }
C++ 解法, 执行用时: 24ms, 内存消耗: 536KB, 提交时间: 2022-06-02
#include <bits/stdc++.h> using namespace std; vector<int> vec; //int类型的数据 vector<int>::iterator it; //int类型的迭代器,it是一个变量 int main(){ int n;//操作数 char str[6];//存放输入:insert/delete int x,y; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%s",str); //insert if(str[0]=='i'){ scanf("%d",&x); scanf("%d",&y); //cin>>x>>y>>endl; //将值x所在的位置返回给迭代器it。即把值x的地址返回给指针it it=find(vec.begin(),vec.end(),x);//若x不存在,迭代器it指向vec.end //将数据y插入链表 vec.insert(it,y); } //delete if(str[0]=='d'){ scanf("%d",&x); it=find(vec.begin(),vec.end(),x); //因为end指向链表末尾的下一个元素,若x不存在删除end指向的元素,会越界访问报错 if(it!=vec.end()) vec.erase(it); } } //链表不为空,输出链表中所有结点的值 if(vec.size()>0){ for(int i=0;i<vec.size();i++){ // cout<<vec.at(i)<<" "; printf("%d ",vec[i]); } } else{ printf("NULL"); } } // #include<bits/stdc++.h> // using namespace std; // // const int N=1e+5; // // int ans[N]; // vector <int> ans; // int n; // string s; // int sizes; // vector<int>::iterator it;//定义一个变量it // //iterator是一种迭代器 // int main(){ // cin>>n; // int x,y; // for(int i=0;i<n;++i){ // cin>>s; // if(s=="insert"){ // cin>>x>>y;//将y插入在第一值为x的结点之前,不存在则插在末尾 // ans.insert(find(ans.begin(),ans.end(),x), y);//先从头到尾找x,在插入 // //insert()用于在it前插入值为y的元素。 // //find()用于在指定范围(ans的begin到end)查找和目标元素(x)值相等的第一个元素 // //begin()返回向量头指针,指向第一个元素 // //end()返回向量尾指针,指向向量最后一个元素的下一个位置 // } // else if(s=="delete"){//删除链表中第一个值为x的结点,若不存在值为x的结点,则不删除。 // cin>>x; // it = find(ans.begin(),ans.end(),x);//先从头到尾找x,再赋值给it; // if(it != ans.end()){//it不等于ans[]最后一个指针 // ans.erase(it); // //删除it处的一个字符 // } // } // } // sizes = ans.size();//获取vecctor类型的长度。 // if(sizes == 0){ // cout << "NULL"; // } // for(int i=0;i<sizes;++i){ // cout << ans.at(i) << " ";//at()返回i处所指的数据,如果idx越界,显示越界。 // } // return 0; // }