链表和STL —— list 【复习笔记】

news/2025/2/24 11:29:16

1. 链表

1.1 链表的定义和类型

和顺序表一样,链表也是一种线性表,线性表存储结构为链式存储就是链表

链式存储不仅要保存数据元素,还要保存数据元素间的关系,这两个部分信息形成了结点。结点有两个域:数据域(存储数据元素)和指针域(存储逻辑关系)

链表又以方向带不带头节点、是否循环分类:

单向循环带头结点
双向不循环不带头结点

共有8种类型

1.2 单链表的实现

1.2.1 实现方式

和顺序表一样,单链表的实现方式也分为静态实现动态实现

静态实现:通过两个数组,第一个数组存储数据元素,第二个数组存储逻辑关系

动态实现:通过new申请结点,delete释放结点

1.2.2 静态带头单链表的模拟实现

#include<iostream>
using namespace std;

//创建
const int N = 1e6 + 10;
int e[N];//存储数据
int ne[N];//存储位置
int h;//标记头结点
int id;//标记下一个指针位置

//下标0位置为哨兵位,初始头结点
//e[N]和ne[N]绑定使用,表示一个元素的数据信息和逻辑信息,也可以将二者放入一个结构体内


//头插,时间复杂度O(1)
void push_front(int x)
{
	//将x放入e数组内存储
	e[++id] = x;
	//头插是指插入哨兵位后一位
	ne[id] = ne[h];
	ne[h] = id;
}

//打印链表,时间复杂度O(N)
void print()
{
	//指针从头结点开始,空指针结束
	for (int i = ne[h]; i ; i = ne[i])
	{
		cout << e[i] << " ";
	}
	cout << endl;
}

//任意位置后插入,时间复杂度O(1)
void insert(int p, int x)//p是位置
{
	//将x放入e数组内存储
	e[++id] = x;
	ne[id] = ne[p];
	ne[p] = id;
}

//按值查找
//法一:遍历链表
//法二:额外开辟一个数组进行标记(存储数据范围不大的情况)
int mp[N];
/*
  push_front和insert的时候标记
  mp[x]=id;位置放在mp数组中,查找时可以直接得到位置

  erase时取消标记
  mp[x]=0;
*/
//方法一,时间复杂度O(1)
int find(int x)
{
	for (int i = ne[h]; i; i = ne[i])
	{
		if (e[i] == x)
		{
			return i;
		}
	}
	return 0;
}
//方法二,使用额外数组,时间复杂度O(1)
return mp[x];

//删除任意位置后的元素,时间复杂度O(1)
void erase(int p)
{
	if (ne[p])
	{
		mp[e[ne[p]]] = 0;
		ne[p] = ne[ne[p]];
	}
}

1.3 双链表的模拟实现

链表的实现无非是在单链表的基础上加一个保存前一个元素位置的数组

//创建
const int N = 1e6 + 10;
int e[N], ne[N];
int pre[N];//存储前一个元素位置
int h, id;
int mp[N];//存储位置

//头插,时间复杂度O(1)
void push_front(int x)
{
	e[++id] = x;
	//先修改插入元素的前后指向
	ne[id] = ne[h];
	pre[id] = h;
	//在修改相邻元素的指向
	pre[ne[h]] = id;
	ne[h] = id;
	//存储位置
	mp[x] = id;
}

//打印数组,时间复杂度O(N)
void print()
{
	for (int i = ne[h]; i; i = ne[i])
	{
		cout << e[i] << " ";
	}
	cout << endl;
}

//按值查找,时间复杂度O(1)
int find(int x)
{
	return mp[x];//直接返回位置
}

//任意位置后插入元素,时间复杂度O(1)
void insert_back(int p, int x)
{
	e[++id] = x;

	mp[x] = id;

	ne[id] = ne[p];
	pre[id] = p;

	pre[ne[p]] = id;
	ne[p] = id;
}

//任意位置前插入一个元素,时间复杂度O(1)
void insert_front(int p, int x)
{
	e[++id] = x;

	mp[x] = id;

	ne[id] = p;
	pre[id] = pre[p];

	ne[pre[p]] = id;
	pre[p] = id;
}

//删除任意位置元素,时间复杂度O(1)
void erase(int p)
{
	mp[e[p]] = 0;

	pre[ne[p]] = pre[p];
	ne[pre[p]] = ne[p];
}

1.4 循环链表

上面的链表,尾指针指向0,单哨兵位就是0位置,所以正好是一个循环

2. list

STL里的list就是动态实现的双向循环链表,涉及new和delete

#include<iostream>
using namespace std;
#include<list>
//打印list
void print(list<int>& lt)
{
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

//push_front/push_back,时间复杂度O(1)
void test1()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_front(2);
	print(lt);
}

//pop_front/pop_back,时间复杂度O(1)
void test2()
{
	list<int> lt;
	for (int i; i <= 10; i++)
	{
		lt.push_back(i);
	}
	for (int i = 1; i <= 2; i++) lt.pop_front();
	for (int i = 1; i <= 3; i++)lt.pop_back();
	print(lt);
}


http://www.niftyadmin.cn/n/5864268.html

相关文章

mysql系列9—mysql的MVCC机制

背景 mysql提供了读未提交、读已提交、可重复读、串行化四种隔离级别&#xff0c;默认的隔离界别为可重复读。其中&#xff0c;不可重复度场景下&#xff0c;每次直接读取最新记录(即使事务未提交)&#xff1b;串行化对于所有的读写都加锁&#xff0c;因此&#xff0c;对二者不…

hive开窗函数边界值ROWS BETWEEN 和 RANGE BETWEEN区别

目录 一、概念 1.rows between ... and ... 2.range between ... and ... 二、语法 1.关键词含义 一、概念 1.rows between ... and ... rows&#xff1a;指以行号来决定frame的范围&#xff0c;是物理意义上的行。 2.range between ... and ... range&#xff1a;指以当…

DeepSeek从入门到精通

1_DeepSeek从入门到精通 (1).pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供1_DeepSeek从入门到精通 (1).pdf最新版正式版官方版绿色版下载,1_DeepSeek从入门到精通 (1).pdf安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123…

生活教练项目_Trae

XMXALifeCoach - 个人成长辅导网站 网址: https://github.com/zhangxiaomeng1/XMXALifeCoach 项目简介 这是一个基于DeepSeek R1 API开发的个人成长辅导网站。通过与AI进行对话&#xff0c;用户可以获得个性化的建议和指导&#xff0c;帮助个人成长。 技术架构 前端&#xff1a…

使用MyCAT实现分布式MySQL双主架构

Mycat是一个开源的分布式数据库中间件&#xff0c;主要用于提供数据库的分库分表、读写分离、负载均衡等功能。以下是Mycat的几个主要作用&#xff1a; 分库分表&#xff1a;Mycat可以将单个数据库拆分成多个小数据库&#xff0c;并将数据分布在不同的节点上&#xff0c;以提高…

《Mycat核心技术》第17章:实现MySQL的读写分离

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 星球项目地址&#xff1a;https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀&#xff0c…

全星FMEA软件系统:赋能企业研发管理,打造可靠产品

全星FMEA软件系统&#xff1a;赋能企业研发管理&#xff0c;打造可靠产品 在当今竞争激烈的市场环境中&#xff0c;产品质量和可靠性已成为企业立足之本。然而&#xff0c;传统的FMEA分析方式往往耗时耗力&#xff0c;效率低下&#xff0c;难以满足企业快速迭代和降本增效的需求…

设计模式-组合模式、模板模式

组合模式 定义 将对象组合成树形结构以表示"部分-整体"的层次结构&#xff0c;组合模式使得用户对单个对象和组合对象的使用具有一致性&#xff1b; 组合模式实现的最关键的地方是-简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进…