首页 > 其他分享 >[链表]用静态数组模拟单链表

[链表]用静态数组模拟单链表

时间:2023-03-20 15:05:20浏览次数:42  
标签:head 单链 idx int ne 链表 数组 节点


来源: 模板题

算法标签 链表

题目描述

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

(1) 向链表头插入一个数;

(2) 删除第k个插入的数后面的数;

(3) 在第k个插入的数后插入一个数

现在要对该链表进行M次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,则按照插入的时间顺序,这n个数依次为:第1个插入的数,第2个插入的数,…第n个插入的数。

输入格式

第一行包含整数M,表示操作次数。

接下来M行,每行包含一个操作命令,操作命令可能为以下几种:

(1) “H x”,表示向链表头插入一个数x。

(2) “D k”,表示删除第k个输入的数后面的数(当k为0时,表示删除头结点)。

(3) “I k x”,表示在第k个输入的数后面插入一个数x(此操作中k均大于0)。

输出格式

共一行,将整个链表从头到尾输出。

数据范围

​1≤M≤100000​​ 所有操作保证合法。

输入样例:

10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6

输出样例:

6 4 6 5

#### 思路
为什么用静态数组模拟链表?
用静态数组模拟链表操作可以将访问从动态的o(n)压到o(1);
在比赛中常牺牲部分空间来换取时间的高效。

删除第t个数据:

将当前位置的连接数组,连接到对应的连接数组的连接数组。

void del(int t)
{
ne[t]=ne[ne[t]];
}

[链表]用静态数组模拟单链表_数据结构

在第K的位置添加节点t

在e[idx]保存值t,当前节点idx指向头节点指向的数值,头节点指向当前节点,当前节点值向后滚动+1.

void add_h(int t)
{
e[idx]=t,ne[idx]=head,head=idx++;
}

[链表]用静态数组模拟单链表_数据结构_02

在指定的位子K后添加节点K:

在e[idx]保存值t,当前节点idx指向节点K指向的节点,节点K指向当前节点,当前节点值向后滚动+1.

[链表]用静态数组模拟单链表_数组_03

void add_k(int k,int t)
{
e[idx]=t,ne[idx]=ne[k],ne[k]=idx++;
}

C++ 代码

#include<iostream>

using namespace std;

const int N=1e5+10;
int e[N],ne[N],idx,head;//e值.ne指针指向,idx当前节点,head头节点

void del(int t)
{
ne[t]=ne[ne[t]];
}

void add_h(int t)
{
e[idx]=t,ne[idx]=head,head=idx++;//head=idx++ idx++是后缀表达式,实际会head=idx赋值完毕之后执行idx++
}

void add_k(int k,int t)
{
e[idx]=t,ne[idx]=ne[k],ne[k]=idx++;
}

int main()
{
int n;
cin>>n;

head=-1;//初始化 head=-1,idx=0; 因为idx全局默认为0,head为-1实质上-1会排在最末用以终结链表
char g;int t,k;
while(n--)
{
cin>>g;
if(g=='H')
{
cin>>t;
add_h(t);
}
else if(g=='D')
{
cin>>k;
if(!k)head = ne[head];
else del(k-1);
}
else
{
cin>>k>>t;
add_k(k-1,t);//因为下标从0开始,所以第k实质为k-1.
}
}
for(int i=head;i!=-1;i=ne[i])cout<<e[i]<<" ";//按找链表指针方式进行更新
return 0;
}


标签:head,单链,idx,int,ne,链表,数组,节点
From: https://blog.51cto.com/u_16014765/6132928

相关文章

  • 【LeetCode贪心#10】划分字母区间(有涉及hash数组的使用)
    划分字母区间力扣题目链接(opensnewwindow)字符串S由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串......
  • 数组的__proto__详解
    当初学习原型链的时候只是看了这个构造函数以及构造函数创建出来的实例对象的原型链条的关系,然后把数组忘记了这里需要说的是,个人理解数组其实本质就是对象,为什么呢?......
  • 链表
    链表的概述链表是由一个一个的节点组成,节点没有名字,每个节点从堆区空间动态申请,节点间是非连续的(物理上),但是每个节点通过指针域保存下一个节点的位置,达到逻辑上的连续......
  • Qt5.12实战之字节数组QByteArray使用
    示例源码:#include<QCoreApplication>#include<QDebug>#include<QTextStream>staticQTextStreamcout(stdout,QIODevice::WriteOnly);#include<iostream>#inclu......
  • 数组和切片
    我们这次主要讨论Go语言的数组(array)类型和切片(slice)类型。数组和切片有时候会让初学者感到困惑。它们的共同点是都属于集合类的类型,它们的值也都可以用来存储某一种类型的......
  • Java基础语法-数组
    第一部分:数组1.数组1.1数组介绍数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2数组的定义格式1.2.1第一种格式数据类型[]数组名示例:int[]arr......
  • Byte和byte[]数组
    https://www.cnblogs.com/cuihongyu3503319/p/5031670.htmlhttps://c.runoob.com/front-end/693/......
  • 数组总结
    1.数组的创建1.1字面量创建(常用)vara=[3,11,8];1.2构造器实际上newArray===Array,加不加new一点影响都没有。vara=Array();//[]创建一个数据的数组......
  • PHP 将空数组统一 json 序列化为 [] 的弊端
    在PHP中表示空的map或空数组都是以空数组形式,在转化为json数据时,会将空数组统一json序列化成 ​​[]​​,这样就存在一个类型问题。以前我们在与前端交互时一般是与弱类......
  • 判断一个数字在数组中是否存在,并返回---Java
    packagepractice.people.apple;//在数组中查找一个数,看是否存在,请返回值publicclassFoundNumber{publicstaticvoidmain(String[]args){//定义数组intar......