7-1 两个有序链表序列的合并
#include<bits/stdc++.h>
using namespace std;
const int N = 1e8 + 10;
int head, idx, e[N], ne[N], a[N];
void init()
{
head = -1, idx = 0;
}
void add_head(int k)
{
e[idx] = k, ne[idx] = head, head = idx ++;
}
void add(int a, int b)
{
e[idx] = b, ne[idx] = ne[a], ne[a] = idx ++;
}
int main()
{
init();
int t = 0, k = 0, j = 1;
for(int i = 0; ; i ++)
{
cin >> a[i];
if(a[i] == -1) break;
t ++;
}
for(int i = t; ; i ++)
{
cin >> a[i];
if(a[i] == -1) break;
t ++;
}
if(t == 0)
{
puts("NULL");
return 0;
}
sort(a, a + t);
add_head(a[0]);
t --;
while(t --)
add(k ++, a[j ++]);
for(int i = head; i != -1; i = ne[i]) printf(ne[i] == -1 ? "%d\n" : "%d ", e[i]);
}
7-2 两个有序链表序列的交集
#include <bits/stdc++.h>
using namespace std;
int main()
{
list<int> l1, l2;
int num;
while (cin >> num && num != -1)
l1.push_back(num);
while (cin >> num && num != -1)
l2.push_back(num);
list<int> res;
auto it1 = l1.begin(), it2 = l2.begin();
while(it1 != l1.end() && it2 != l2.end())
{
if(*it1 == *it2)
{
res.push_back(*it1);
it1 ++;
it2 ++;
}
else if (*it1 < *it2) it1 ++;
else it2 ++;
}
if(res.empty()) cout << "NULL\n";
else
{
for(it1 = res.begin(); it1 != res.end(); it1 ++)
{
cout << *it1;
if (next(it1) != res.end()) cout << " ";
}
}
}
7-3 重排链表
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
int data;
int next;
int pre;
} res[N];
vector<int> ans;
int main()
{
int fip, n;
cin >> fip >> n;
for(int i = 0; i < n; i ++)
{
int ip;
cin >> ip;
cin >> res[ip].data >> res[ip].next;
}
int cnt = 0;
int p = fip;
int q = -1;
while(p != -1)
{
res[p].pre = q;
q = p;
p = res[p].next;
cnt ++;
}
p = fip;
while(q != -1 && p != -1)
{
ans.emplace_back(q);
ans.emplace_back(p);
q = res[q].pre;
p = res[p].next;
}
for(int i = 0; i < cnt - 1; i ++)
printf("%05d %d %05d\n", ans[i], res[ans[i]].data, ans[i + 1]);
printf("%05d %d -1\n", ans[cnt - 1], res[ans[cnt - 1]].data);
}
7-4 约瑟夫环
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int main()
{
int n, m;
cin >> n >> m;
list<int> l;
for(int i = 1; i <= n; i ++)
l.push_back(i);
auto it = l.begin();
while(!l.empty())
{
for(int i = 0; i < m - 1; i ++)
{
it ++;
if(it == l.end()) it = l.begin();
}
cout << *it;
it = l.erase(it);
if(!l.empty())
{
cout << " ";
if(it == l.end()) it = l.begin();
}
}
}
7-5 单链表的创建及遍历
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int main()
{
int n;
cin >> n;
list<int> l;
while(n --)
{
int y;
cin >> y;
l.push_back(y);
}
for(auto it = l.begin(); it != l.end(); it ++)
{
cout << *it;
if(next(it) != l.end()) cout << " ";
}
}
7-6 链表去重
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int b[N], d[N], s[N];
int x, y, z;
struct node {
int data;
int next;
} a[N];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < m; i ++)
{
cin >> x >> y >> z;
a[x].data = y;
a[x].next = z;
}
int t = 0, k = 0;
if(m == 1) printf("%05d %d %d", n, a[n].data, -1);
else
{
while(n != -1)
{
if(s[abs(a[n].data)] == 0)
{
b[t ++] = n;
s[abs(a[n].data)] = 1;
}
else d[k ++] = n;
n = a[n].next;
}
for(int i = 0; i < t - 1; i ++)
printf("%05d %d %05d\n", b[i], a[b[i]].data, b[i + 1]);
printf("%05d %d %d\n", b[t - 1], a[b[t - 1]].data, -1);
for(int i = 0; i < k - 1; i ++)
printf("%05d %d %05d\n", d[i], a[d[i]].data, d[i + 1]);
printf("%05d %d %d\n", d[k - 1], a[d[k - 1]].data, -1);
}
}
7-7 单链表就地逆置
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int head, idx, e[N], ne[N], a[N];
void init()
{
head = -1, idx = 0;
}
void add_head(int k)
{
e[idx] = k, ne[idx] = head, head = idx ++;
}
int main(){
int n;
cin >> n;
while(n --)
{
init();
for(int i = 0; ; i ++)
{
cin >> a[i];
if(a[i] == -1) break;
add_head(a[i]);
}
for(int i = head; i != -1; i = ne[i]) printf(ne[i] == -1 ? "%d\n" : "%d ", e[i]);
}
}
7-8 带头节点的双向循环链表操作
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int main()
{
list<int> l;
int x, f = 1;
while(cin >> x)
{
if(x == -1) break;
else
{
if(f == 1)
{
l.push_front(x);
f = 2;
}
else
{
l.push_back(x);
f = 1;
}
}
}
for(auto it = l.begin(); it != l.end(); it ++)
{
cout << *it;
if(next(it) != l.end()) cout << " ";
}
cout << endl;
l.reverse();
for(auto it = l.begin(); it != l.end(); it ++)
{
cout << *it;
if(next(it) != l.end()) cout << " ";
}
}
7-9 头插法创建单链表、遍历链表、删除链表
#include<bits/stdc++.h>
using namespace std;
const int N = 1e7 + 10;
int head, idx, e[N], ne[N], a[N];
void init()
{
head = -1, idx = 0;
}
void add_head(int k)
{
e[idx] = k, ne[idx] = head, head = idx ++;
}
int main()
{
int n;
cin >> n;
while(n --)
{
init();
for(int i = 0; ; i ++)
{
cin >> a[i];
if(a[i] == -1) break;
add_head(a[i]);
}
for(int i = head; i != -1; i = ne[i]) printf(ne[i] == -1 ? "%d \n" : "%d ", e[i]);
}
}