首页 > 其他分享 >基础数据结构——初级——链表

基础数据结构——初级——链表

时间:2024-07-19 10:00:49浏览次数:19  
标签:include mc int list 链表 初级 grn 数据结构

链表的特点是一组位于任意位置的存储单元存储线性表的数据元素。一般分为单向链表和双向链表(如下图所示)。

 

使用链表时,可以用STL的list,也可以自己写链表。如果自己写代码实现链表,有两种编码实现方法:动态链表和静态链表。在算法竞赛中为加快编码速度,一般用静态链表或者STL的list。所以接下来只为大家讲解这两种。

https://www.luogu.com.cn/problem/P1996  以经典的约瑟夫问题讲解

 第一种方法:用结构体数组实现双向静态链表

#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{
	int id;//节点编号 
	//int data;
	int preid,nextid;//前一个节点,后一个节点 
}nodes[N];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	nodes[0].nextid=1;//可以理解为头节点 
	for(int i=1;i<=n;i++)//建立链表 
	{
		nodes[i].id=i;
		nodes[i].nextid=i+1;//后节点 
		nodes[i].preid=i-1;//前节点 
	}
	nodes[n].nextid=1;//循环链表:尾指向头 
	nodes[1].preid=n;//头指向尾 
	int now=1;
	while((n--)>1)
	{
		for(int i=1;i<m;i++)  now=nodes[now].nextid;//数到m停下 
		printf("%d ",nodes[now].id);//打印节点 后面带空格 
		int prev=nodes[now].preid,next=nodes[now].nextid;
		nodes[prev].nextid=nodes[now].nextid;//删除now 注意这里的删除并不是真正的删除 其实就是跳过 
		nodes[next].preid=nodes[now].preid;
		now=next;
	}
	printf("%d",nodes[now].nextid);//打印最后一个节点后面不带空格 
	return 0;
}

 第二种方法:用一维数组实现单向链表

#include<bits/stdc++.h>
using namespace std;
const int N=150;
int nodes[N];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n-1;i++) nodes[i]=i+1;//nodes[i]的值就是下一个节点 
	nodes[n]=1;//循环链表:尾指向头 
	int now=1,prev=1;//从第一个节点开始 
	while((n--)>1)
	{
		for(int i=1;i<m;i++)//数到m停下 
		{
			prev=now;
			now=nodes[now];//下一个节点 
		}
		printf("%d ",now);
		nodes[prev]=nodes[now];//删除now 
		now=nodes[prev];//新的now节点 
	}
	printf("%d",now);//打印最后一个节点不带空格 
}

第三种方法:STL list。 list是双向链表,通过指针访问节点数据,高效率的删除和插入。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,m; cin>>n>>m;
	list<int>node;
	for(int i=1;i<=n;i++) node.push_back(i);//建立链表 
	list<int>::iterator it=node.begin();
	while(node.size()>1)
	{
		for(int i=1;i<m;i++)//数到m 
		{
			it++;
			if(it==node.end()) it=node.begin();//到尾后回头 
		}
		cout<<*it<<" ";
		list<int>::iterator next= ++it;
		if(next==node.end()) next=node.begin();//循环链表 
		node.erase(--it);//删除这个节点 
		it=next;
	}
	cout<<*it<<endl;
	return 0;
}

练习题:https://www.luogu.com.cn/problem/P1160 

 

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<list> //底层实现是双向链表 
using namespace std;
const int N=100010;
int mc[N];
list<int>::iterator p[N];//定义一个迭代器 
int main()
{
	list<int>grn;
	grn.push_front(1);//把1插入链表头 
	p[1]=grn.begin();//list是用指针访问的 
	int n;
	cin>>n;
	int k,a;
	for(int i=2;i<=n;i++)
	{
		cin>>k>>a;
		if(a==0)
		{
			p[i]=grn.insert(p[k],i);//insert函数是(指针,数)将这个数插入指针之前的一个位置  
		}                           // insert(x,2) x为1的指针  2 3 1 4 就会变成 2 3 2 1 4 
		else
		{
			list<int>::iterator it=p[k];
			it++;//指针后移 
			p[i]=grn.insert(it,i);
		}
	}
	int m;
	cin>>m;
	for(int i=0;i<m;i++)
	cin>>mc[i];
	sort(mc,mc+m);
	int t=unique(mc,mc+m)-mc;
	for(int i=0;i<t;i++)
	{
		grn.erase(p[mc[i]]);
	}
	for(list<int>::iterator iter=grn.begin();iter!=grn.end();iter++)//用指针访问 
	cout<<*iter<<" ";
	return 0;
}

 

 

标签:include,mc,int,list,链表,初级,grn,数据结构
From: https://blog.csdn.net/2301_79967286/article/details/140513108

相关文章

  • 【数据结构】- 线段树
    前言线段树用于维护区间上的值,可以在$O(\logn)$的时间复杂度内实现单点,区间修改及查询。并且所有满足结合律的运算都可以用线段树进行加速。基本操作建树给你长度为$n$的正整数序列$A$,要你实现单点修改与区间查询。(加和)这就是线段树的基本题目。线段树,字面上来看就是把......
  • 攻克链表篇
    leetcode206翻转链表题目描述:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[]算法思想:创建一个空链表头指针,将原给链表的节点依次遍历......
  • 第四节 JMeter基础-初级登录【固定用户登录】
    声明:本文所记录的仅本次接口测试所用到的知识点。1.认识JMeter(1)测试计划:测试的起点,所有组件的容器。相当于一个测试项目,对测试计划展开一系列的操作。(2)线程组:一定数量的用户。  ①线程数:1。默认为1,表示一个用户。  ②Ramp-UP时间:1。默认是1秒,表示启动线程的时间。在n秒......
  • 【算法】删除有序链表中的重复元素、保留重复节点的一个
    1.概述存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次。返回同样按升序排列的结果链表。本问题和【算法】删除有序链表中的重复元素、不保留重复节点很类似,但是思考起来稍微简单些,建议看完这个,看链接的这个吧。2.......
  • 基于Python语言的入门算法和数据结构(持续更新中,求关注一波)[链表 栈 队列 复杂度 操作]
    这篇文章主要是讲的Python语言的算法,本人还在不断记笔记中,文章也会持续更新,内容比较浅薄,请大家指教另外推荐一个比较好用的记笔记的软件Typora,自己已经使用很久了,感觉不错。。。虽然但是还是有欠缺。目录第一章算法概述1.1什么是数据结构?01数据结构都有哪些组成方式02......
  • 链表(3) ----快慢指针,求中间节点
    目录快慢指针算法步骤:为什么有效?使用场景:力扣876题目 方法代码 力扣142题目方法1代码 方法2 思路代码 官网地址:https://www.dhcode.cn/p/t_pc/goods_pc_detail/goods_detail/term_624bd804b3d39_Ac0g7V?fromH5=true&type=3&channel_id=&pro_id=term_62......
  • Java中的并发数据结构与多线程优化技术
    Java中的并发数据结构与多线程优化技术大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在多线程编程中,并发数据结构和优化技术是提高系统性能和可靠性的关键。Java提供了丰富的并发数据结构和多线程优化技术,本文将详细介绍常用的并发数据结构及其使用方法......
  • 【数据结构】队列:链表实现
    队列:链表实现结构描述:typedefintDataType;typedefstructQueueNode{DataTypeA;structQueueNode*Next;}Node;classQueueLinked{public://队头、队尾指针Node*Front;Node*Next;//队列操作//把元素X入队voidPush(Dat......
  • 【数据结构】循环队列:链表实现
    循环队列:链表实现结构描述typedefintDataType;typedefstructQueueNode{DataTypeA;structQueueNode*Next;}Node;classQueueCycLinked{public://队头、队尾指针Node*Front;Node*Next;//队列操作//把元素X入队voidPu......
  • 单链表
    单链表结构描述#include<iostream>#include<cstdlib>usingnamespacestd;typedefintDataType;//链表节点typedefstructNode{DataTypeA;structNode*Next;}Node;classSingleLinkedList{private:Node*Head;public://尾插......