信友队集训营--1--链表

news/2025/3/25 1:49:52/文章来源:https://www.cnblogs.com/sfs-sf/p/18340072

算法随笔(1): 信友队集训营--1--链表

链表

单向链表

计算机常见的两种存储结构分别是顺序存储链式存储

顺序存储(以数组方式呈现)

优点有:操作方便,随机存取,查找元素的时间复杂度为O(1)

缺点有:需要预设空间,过大浪费,过小越界。插入或删除元素不方便,需要O(N)的复杂度

链式存储(以链表方式呈现)

优点有:存储空间是动态分配的,只要计算机内存还有,就不会溢出。插入、删除元素方便,时间复杂度均为O(1)

缺点有:查找元素不方便,需要O(N)的时间复杂度

链表中节点的联系

为了表示每个元素与后继元素的逻辑关系,以便构成“一个节点链着一个节点”的链表,每个节点除了存储元素本身的信息外,还要存储其后继节点的地址,这样通过地址能形成链接。

即每个节点包含两个部分:存储元素本身的数据域存储下一个节点地址的指针域(如下图)

单链表

链表中的第一个节点称为头结点,最后一个节点,称为尾节点,头结点一板不存储数据,尾节点的指针为空(NULL)

链表一般分为:单向链表,循环链表,双向链表,而这种就是单向链表

单链表的建立

了解了链表的相关概念后,要如何建立并使用一个单链表呢?

第一步:定义结构体存储节点信息

struct uuu{int data;uuu *next;
};

第二步:创建头结点和尾节点

头结点起带头作用,尾节点用于新增节点

c++中使用new运算符来动态申请空间,格式:数据类型 指针变量 = new 数据类型;

uuu *head,*tail;
head=new uuu;//申请空间
head->next=NULL
tail=head;

第三步:创建多个新节点,并依次链接到链表的尾节点之后

long long n;
uuu *p;
for(long long i=1;i<=n;i++)
{p=new uuu;cin>>p->data;p->next=NULL;tail->next=p;tail=p;
}

单链表的操作--打印

p->next=NULL;
while(p!=NULL)
{cout<<p->data<<" ";p=p->next;
}

单链表的操作--查找

查找链表中值为x的点

p=head->next;
while(p->data!=x && p->next!=NULL)
{p=p->next;
}

单链表的操作--删除

删除节点p的下一个节点

p->next=p->next->next;

单链表的操作--插入

在单链表的p节点之后插入一个节点

s->next=p->next;
p->next=s;

循环链表

单向循环链表是另一种形式的链式存储结构。它的特点是表中最后一个节点的指针域指向头结点,整个链表形成一个环

tail->next=head;

双向链表

双向链表中的每一个节点都有两个指针域和若干个数据域,其中一个指向前面,一个指向后面。优点是:访问、插入、删除更方便。但是就是要以空间复杂度来换时间复杂度

双向链表的建立

struct uuu{long long data;uuu *pre,*next;
};

双向链表的操作--删除

p->pre->next=p->next;
p->next-pre=p->pre;

双向链表的操作--插入

在p节点后插入一个s节点

s->next=p->next;
p->next->pre=s;
s->pre=p;
p->next=s;

练习

用数组模拟实现双链表

·双链表的一个节点包括节点的值、节点的left指针、节点的right指针。

·left指针存储该节点的左侧节点的下标;right指针存储该节点的右侧节点的下标。

·数组e、数组l、数组r通过下标相等,每三个关联作为一个完整的节点即e[2],l[2],r]2];e[3],l[3],r[3];e[4],l[4],r[4]……

1.初始化

首先,进行初始化:
将下标为0的位置设为左端点,将下标为1的位置十位右端点,两端点不存储e值,idx表示即将使用到的数组下标

void init()//初始化
{r[0]=1;//右指针l[1]=0;//左指针idx=2;
}

插入操作

假如要在位置k的右边插入第idx个数字x,操作如下:

e[idx]=x;//赋值
r[idx]=r[k];//将x的右指针指向位置k的下一个
l[idx]=k;//将
l[r[k]]=idx;
r[k]=idx;

删除操作

加入要删除位置为k的元素,操作如下:

r[l[k]]=r[k];
l[r[k]]=l[k];

最终练习

【题目描述】

实现一个双链表,双链表初始为空,支持5种操作:

在最左侧插入一个数;

在最右侧插入一个数;

将第k个插入的数删除;

在第k个插入的数左侧插入一个数;

在第k个插入的数右侧插入一个数;

现在要对该链表进行M次操作,

进行完所有操作后,从左往右输出整个链表。

【题目解析】

思路1

用 STL模板库中自带的list容器进行模拟

TLE 80分

就算是开了O2优化,也只有80分

为什么呢,主要问题就出现在第三、四、五个操作上,需要O(n)的复杂度来查找,那么怎么优化呢,用我们上面讲的数组的方法就行

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int l[N],r[N],e[N],idx;
void add(int k,int x)//插入
{e[idx]=x;r[idx]=r[k];l[idx]=k;l[r[k]]=idx;r[k]=idx;idx++;
}
void del(int k)//删除
{r[l[k]]=r[k];l[r[k]]=l[k];
}
int main()
{int m;l[1]=0;r[0]=1;idx=2;cin>>m;while(m--){string a;cin>>a;int x,k;if(a=="L"){cin>>x; add(0,x);}else if(a=="R"){cin>>x;add(l[1],x);}else if(a=="D"){cin>>k;del(k+1);}else if(a=="IL"){cin>>k>>x;add(l[k+1],x); }else if(a=="IR"){cin>>k>>x;add(k+1,x);}}for(int i=r[0];i!=1;i=r[i]){cout<<e[i]<<" ";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware NSX 4.1.2.5 发布,新增功能概览 (32 个已知问题修复)

VMware NSX 4.1.2.5 发布,新增功能概览 (32 个已知问题修复)VMware NSX 4.1.2.5 发布,新增功能概览 (32 个已知问题修复) VMware NSX 4.1.2.5 下载 - 网络安全虚拟化平台 构建具有网络连接和安全性的云智能网络,跨多种云环境支持一致的策略、运维和自动化。 请访问原文链接:…

分支结构

分支结构 目录分支结构一、分支结构分类单一分支双分支多分支switch语句二、应用场景三、设计原则一、分支结构分类单一分支 单一分支结构是最简单的分支结构,它只有一个条件判断,当条件为真(True)时执行一段代码,否则不执行任何操作。例如,使用if语句实现: if (条件) {…

m3u8下载工具N_m3u8DL-CLI的图形界面增强版

摘自:https://zhuanlan.zhihu.com/p/672615148简介(仅windows) N_m3u8DL-CLI是个非常方便的开源免费m3u8下载工具,自带一个叫Simple GUI的简单图形界面。 但是这个图形界面工具,太过简单,连任务列表都没有。所以,这里二次开发,增加了任务列表功能。 新增的所有功能,请…

Python的GDAL库绘制多波段、长时序遥感影像时间曲线图

本文介绍基于Python中的gdal模块,对大量长时间序列的栅格遥感影像文件,绘制其每一个波段中、若干随机指定的像元的时间序列曲线图的方法~本文介绍基于Python中的gdal模块,对大量长时间序列的栅格遥感影像文件,绘制其每一个波段中、若干随机指定的像元的时间序列曲线图的方法…

SmolLM: 一个超快速、超高性能的小模型集合

简介 本文将介绍 SmolLM。它集合了一系列最尖端的 135M、360M、1.7B 参数量的小模型,这些模型均在一个全新的高质量数据集上训练。本文将介绍数据整理、模型评测、使用方法等相关过程。 引言 近期,人们对能在本地设备上运行的小语言模型的兴趣日渐增长。这一趋势不仅激发了相…

定制直播软件,分布式锁的演进你了解多少?

定制直播软件,分布式锁的演进你了解多少?分布式锁的演进基本原理我们可以同时去一个地方“占坑”,如果占到,就执行逻辑。否则就必须等待,直到释放锁。“占坑”可以去redis,可以去数据库,可以去任何大家都能访问的地方。等待可以自旋的方式。阶段一 public Map<String…

TinyVue v3.17.0 正式发布,推出了一款基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!

你好,我是 Kagol。 我们非常高兴地宣布,2024年6月26日,TinyVue 发布了 v3.17.0 🎉。 TinyVue 每次大版本发布,都会给大家带来一些实用的新特性,上一个版本我们重构了 chart-core,新增 CircleProcessChart 圆环进度图等6个新的图表组件,并增加了 Statistic 数据统计组件…

成品app直播源码搭建,常用数据处理手段代码分析

成品app直播源码搭建,常用数据处理手段代码分析数据合并数据准备首先定义一个 DataFrame 数据集:import pandas as pddf_a = pd.DataFrame(columns=[name, rank], data=[[C, 1], [java, 2], [python, 3], [golang, 4]]) df_b = pd.DataFrame(columns=[name, year], data=[[ja…

VUE动态路由和按钮的实现

动态路由 动态菜单 //通过循环组件完成动态菜单<el-menu active-text-color="#ffd04b" background-color="#545c64" class="el-menu-vertical-demo" text-color="#fff":collapse="isCollapse" router default-active sty…

最小圆覆盖

性质一:最小圆覆盖是唯一的 证:若存在两个最小圆,如下显然所有点只能存在于两个圆的交集中,于是以中间那条实心蓝线为直径做一个圆,这个圆显然更小而且能够覆盖所有点 性质二:若我们已经用最小覆盖圆覆盖了所有点,设这些点的点集为\(S\),现在我们新加入一个点\(p\),若…

匈牙利算法--二分图的最大匹配

匈牙利算法--二分图的最大匹配给定一个二分图,其中左半部包含 n1个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。 数据保证任意一条边的两个端点都不可能在同一部分中。 请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图 G,在 G的一…

vsftpd源码学习(一)

文件介绍文件名 作用access.c 定义了检查有无权限访问指定文件的函数ascii.c 定义了二进制数据转ascii数据的函数banner.c 定义了提示信息相关函数main.c 定义了主函数oneprocess.c 定义了单进程方式相关的函数twoprocess.c 定义了多进程方式相关的函数makefile vsftpd的makefi…