.双链表.

2024-05-08 04:28
文章标签 双链

本文主要是介绍.双链表.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 题目:

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

  1. 在最左侧插入一个数;
  2. 在最右侧插入一个数;
  3. 将第 k𝑘 个插入的数删除;
  4. 在第 k𝑘 个插入的数左侧插入一个数;
  5. 在第 k𝑘 个插入的数右侧插入一个数

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

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

输入格式

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

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

  1. L x,表示在链表的最左端插入数 x𝑥。
  2. R x,表示在链表的最右端插入数 x𝑥。
  3. D k,表示将第 k𝑘 个插入的数删除。
  4. IL k x,表示在第 k𝑘 个插入的数左侧插入一个数。
  5. IR k x,表示在第 k𝑘 个插入的数右侧插入一个数。
输出格式

共一行,将整个链表从左到右输出。

数据范围

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

输入样例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
输出样例:
8 7 7 3 2 9

 

核心步骤: 

 

/*
之所以需要k+1,是因为idx=2,应该是k-1+2=k+1。(k-1如上节单链表,数组是从0开始
所以第k个插入在数组上是k-1)*/
#include<bits/stdc++.h>using namespace std;const int N=1e6+50;
int m;
int l[N],r[N],idx,n[N];//0为左端点,1为右端点。所以右端点的左边等于1(r[0]=1)~
void init()
{l[1]=0;r[0]=1;idx=2;
}void remove(int k)
{r[l[k]]=r[k];l[r[k]]=l[k];
}
//在k的右边
void add_to_right(int k,int x)
{
//记录数值n[idx]=x;
//将插入值的右指针,指向k的右指针:Ⅰr[idx]=r[k];
//将插入值的左指针指向k:Ⅱl[idx]=k;
//将k右指针的左指针指向插入值:Ⅲl[r[k]]=idx;
//将k的右指针指向插入值:Ⅳr[k]=idx;idx++;
}int main()
{init();cin >> m;while(m--){string a;cin >> a;int x,k;if(a=="L"){//在最左边插入,就是在左端点的右边插入~cin >> x;add_to_right(0,x);}else if(a=="R"){//在最右边插入,就是在右端点的左边插入~cin >> x;add_to_right(l[1],x);}else if(a=="D"){cin >>k;remove(k+1);}//左边插入else if(a=="IL"){cin >> k >> x;//因为上述是对k的右边进行插入,所以将k的左边的指针传入函数//即在k的左边的右边插入~add_to_right(l[k+1],x);}else {cin >> k >> x;add_to_right(k+1,x);}}for(int i=r[0];i != 1;i=r[i]) cout << n[i] << " ";return 0;
}

这篇关于.双链表.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969305

相关文章

数据结构——双链表实现和注释浅解

关于双链表的基础部分增删查改的实现和一点理解,写在注释里~  前言              浅记   1. 哨兵位的节点不能被删除,节点的地址也不能发生改变,所以是传一级指针 2. 哨兵位并不存储有效数据,所以它并不是有效节点 3. 双向链表为空时,说明只剩下一个头节点(哨兵位)  List.h #pragma once#include<

浅谈单链表与双链表的区别

数组的优点 随机访问性强(通过下标进行快速定位) 查找速度快 数组的缺点 插入和删除效率低(插入和删除需要移动数据) 可能浪费内存(因为是连续的,所以每次申请数组之前必须规定数组的大小,如果大小不合理,则可能会浪费内存) 内存空间要求高,必须有足够的连续内存空间。 数组大小固定,不能动态拓展 链表的优点 插入删除速度快(因为有next指针指向其下一个节点,通过改变指针的指向可以方便的增加删除元素)

数据结构-双链表-详解

数据结构-双链表-详解 1.前言2.结构2.1双向2.2带头2.3循环 3.实现3.1结构体3.2初始化与删除初始化删除 3.3插入尾插头插 3.4删除尾删头删 3.4查找3.5pos位置的插入删除 1.前言 链表总共有八种:双向、单向;带头、不带头;循环、不循环。(8 = 2 * 2 * 2) 在前两篇博客中,我讲了单链表,具体来说,是 单向、不带头、不循环 的链表。 这种

2024.8.24 Python,链表异常断裂问题,双链表的建立问题,全排列中的引用机制与copy的使用,最大子数组和

1.浏览器系统设计 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步。 请你实现 BrowserHistory 类: BrowserHistory(string homepage) ,用 homepage 初始化浏览器类。 void visit(string url)

链表初解(二)——双链表的创建、删除、插入

下面是基本的双链表操作,由于双链表有两个方向,所以在删除和插入节点时,可以节省一个指针,只用一个链表上的指针和一个待操作的指针即可完成插入和删除;同时也要注意在编写双链表时对情况的判断要仔细,否则很容易出错~ #include<iostream>using namespace std;typedef struct student{int data;struct student *next

使用单指针实现双链表(C++语言)

本文是Clifford A. Shaffer所著《数据结构与算法分析》(C++版)习题4.4的解答。 链表是常见的数据结构,链表中的结点通常定义如下。 template <typename E> class Link {public:E element;Link<E> *next;Link(const E& it, Link<E>* next) { }}; 结点是一个定义为Link的模

在单链表和双链表中删除倒数第k个节点

实现的完整代码如下: //在单链表和双链表中删除倒数第k个节点public class DeleteList{//单链表节点的定义public static class Node{int value;Node next;public Node(int data){this.value=data;}}//删除单链表中倒数第k个节点public static int DeletList_K(

Blossom:支持私有部署的云端双链笔记软件分享

Blossom 是一款支持私有部署的云端双链笔记软件,能够帮助用户将笔记、图片和个人计划安排保存在自己的服务器中,并在任意设备之间实时同步。同时,它还可以作为一个动态博客使用。本文将详细介绍 Blossom 的特点和使用方法。 一、Blossom 的特点 1. 完善的文件关系 Blossom 不依赖任何三方存储和图床,其本身就是一个图床。它提供了完善的图片管理功能,包括防误删和图片与文章

双链表——AcWing.827双链表

双链表 定义 双链表是链表的一种,它的每个节点有两个指针,一个指向前一个节点,一个指向后一个节点。这样使得链表可以双向遍历。 运用情况 频繁进行前后双向遍历操作时非常有用,比如在一些需要来回移动处理数据的场景。可以方便地实现诸如栈、队列等数据结构的混合操作。在一些需要快速插入和删除节点,同时又需要双向遍历的特定算法和程序中经常被采用。 注意事项 内存管理要恰当,确保正确地分配和释放节点

数组模拟单链表和双链表

目录 单链表 初始化 头插 删除 插入  双链表 初始化 插入右和插入左 删除 单链表 单链表主要有三个接口:头插,删除,插入(由于单链表的性质,插入接口是在结点后面插入) 初始化 int e[N], ne[N]; // 不使用next[N],为和库中next分开,以免命名冲突int index, head;void init(){head = -1;