当前位置: 首页 > article >正文

蓝桥备赛(13)- 链表和 list(下)

一、动态链表 - list (了解)

new 和 delete 是非常耗时的操作
在算法比赛中,一般不会使使用 new 和 delete 去模拟实现一个链表。
而且STL 里面的 list 的底层就是动态实现的双向循环链表,增删会涉及 new 和 delete,效率不高,竞赛中一般不会使用,这里了解一下即可。

1.1 创建 list

包含头文件<list>  , 使用方法和vector 差不多

#include <iostream>
#include <cstdio>
#include <list>
using namespace std;

int main()
{
	list<int> lt;//创建一个存储int 类型的链表 
	return 0;
}

1.2 push_front/push_back

1) push_front : 头插

2)push_back:尾插

时间复杂度:O(1)

#include <iostream>
#include <cstdio>
#include <list>
using namespace std;

void print(list<int>& i)
{
	for(auto e:i)
	{
		cout << e << " " ;
	}
	cout << endl;
}

int main()
{
	list<int> lt;//创建一个存储int 类型的链表 
	
	//尾插
	for(int i = 1;i<=5 ;i++)
	{
		lt.push_back(i); 
		print(lt);
	 } 
	 //头插
	 for(int i = 1;i <= 5 ; i++)
	 {
	 	lt.push_front(i);
		 print(lt); 
	  } 
	return 0;
}

1.3 pop_front / pop_back

1)pop_front : 头删

2)pop_back:尾删

时间复杂度:O(1)

	  //头删
	  for(int i = 1;i<=6 ; i++)
	  {
	  	lt.pop_front(); 
	   } 
	   print(lt);
	   
	   //尾删 
	   for(int i = 1;i<=2;i++)
	   {
	   	lt.pop_back() ;
	   }
	   print(lt);

1.4 所有测试代码

#include <iostream>
#include <cstdio>
#include <list>
using namespace std;

void print(list<int>& i)
{
	for(auto e:i)
	{
		cout << e << " " ;
	}
	cout << endl;
}

int main()
{
	list<int> lt;//创建一个存储int 类型的链表 
	
	//尾插
	for(int i = 1;i<=5 ;i++)
	{
		lt.push_back(i); 
		print(lt);
	 } 
	 //头插
	 for(int i = 1;i <= 5 ; i++)
	 {
	 	lt.push_front(i);
		 print(lt); 
	  } 
	  
	  //头删
	  for(int i = 1;i<=6 ; i++)
	  {
	  	lt.pop_front(); 
	   } 
	   print(lt);
	   
	   //尾删 
	   for(int i = 1;i<=2;i++)
	   {
	   	lt.pop_back() ;
	   }
	   print(lt);
	return 0;
}

二、算法题

2.1 排列顺序

B3630 排队顺序 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 1e6 + 10;
int n,h;
int ne[N];

int main()
{
	cin >> n;

	for(int i = 1;i<= n ; i++)
	{
		cin >> ne[i];
	}
	cin >> h;
	
	//遍历链表
	for(int i = h;i;i = ne[i])
	{
		cout << i << " ";
	 } 
	return 0;
}

2.2 单向链表

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 1e5 + 10;
const int M = 1e6 + 10;

//链表
int h,id,e[N],ne[N];
int mp[M];//mp[i]用来标记i 这个元素存储再什么位置 
int main()
{
	int q; 
	cin >> q;
	
	//初始化
	id++;
	e[id] = 1;
	mp[1] = id; 
	
	while(q--)
	{
		int op,x,y;
		cin >> op >> x;
		int p = mp[x];//x 存的位置 
		
		if(op == 1)//尾部插入 
		{
			cin >> y;
			id++;
			e[id] = y;
			ne[id] = ne[p];
			ne[p] = id;
			
			mp[y] = id;//标记 y 这个位置 
		}
		else if(op == 2)
		{
			cout << e[ne[p]] << endl;
		}
		else//删除 x 后面的元素 
		{
			ne[p] = ne[ne[p]];
		}
	}
	return 0;
}

2.3 队列安排

P1160 队列安排 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 1e5 + 10;
//双向链表 
int pre[N],ne[N],h;

int n,m;
bool st[N];//st[i] 表示 i 这个同学是否出队 
int main()
{
	cin >> n;
	//初始化
	 pre[1] = h;
	 ne[h] = 1;
	 
	 for(int i = 2;i<=n ; i++)
	 {
	 	int k,p;
	 	cin >> k >> p;
	 	if(p == 0)
	 	{
	 		//i 放在 k 的左边
			 ne[i] = k;
			 pre[i] = pre[k];
			 ne[pre[k]]	= i;
			 pre[k] = i;
		}
		else//i 放在 k 的右边 
		{
			pre[i] = k;
			ne[i] = ne[k];
			pre[ne[k]] = i;
			ne[k] = i;
		}
	 }
	 
	 cin >> m;
	 while(m--)
	 {
	 	int x;
	 	cin >> x;
	 	if(st[x]) continue;
	 	
	 	ne[pre[x]] = ne[x];
	 	pre[ne[x]] = pre[x];
	 	st[x] = true;//表示X已经删除 
	 	
	 }
	 for(int i = ne[h];i ; i = ne[i])
	 {
	 	cout << i << " ";
	 }
	return 0;
} 

 

2.4 约瑟夫问题

P1996 约瑟夫问题 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

const int N = 110;
int n,m,ne[N];

int main()
{
	cin >> n >> m;
	//创建循环链表
	for(int i = 1 ; i < n ; i++)
	{
		ne[i] = i + 1;	
	} 
	ne[n] = 1;
	
	//模拟游戏过程
	int t = n;
	for(int i = 1;i<=n;i++)//执行n次出圈操作 
	{
		for(int j = 1; j < m ; j++)
		{
			t = ne[t];
		}
		cout << ne[t] << " ";
		ne[t] = ne[ne[t]];
	} 
}


http://www.kler.cn/a/578069.html

相关文章:

  • Linux(ubuntu)环境下部署The Fuck项目的方法(保姆级教程)
  • Feign 核心规则与最佳实践:避免入坑指南
  • 【哇! C++】类和对象(三) - 构造函数和析构函数
  • LeetCodehot 力扣热题100 跳跃游戏2
  • Python 性能优化:从入门到精通的实用指南
  • 微信小程序调用阿里云的大规模模型+后端 python 实现人与人工智能进行对话
  • 【Oracle学习笔记】1.数据库组成对象
  • Linux中的进程优先级与设置方法
  • 可视化编辑器选择
  • Vulnhub-Node
  • C++ 模版★★★
  • Android Coil总结
  • c#事件案例与分析
  • 2025年Linux 安全与运维指南
  • 机试题——微服务群组
  • React基础之useCallback
  • LeetCode刷题实战:删除字符串中的所有相邻重复项(栈的经典应用)
  • 2025-03-07 学习记录--C/C++-PTA 习题8-1 拆分实数的整数与小数部分
  • 哪些培训课程适合学习PostgreSQL中级认证知识?
  • CS144 Lab Checkpoint 6: building an IP router