AcWing - 双链表(模拟)

题目链接:https://www.acwing.com/problem/content/description/829/
时/空限制:1s / 64MB

题目描述

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

(1) 在最左侧插入一个数;

(2) 在最右侧插入一个数;

(3) 将第k个插入的数删除;

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

(5) 在第k个插入的数右侧插入一个数

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

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

解题思路

题意:对双向链表有5种操作,求出n次操作后的双向链表。
思路:直接模拟,写的是数组型的,不过操作和指针的类似。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
struct List {
    int data, prior, next;
    List() {
        prior = -1;
        next = -1;
    }
    List(int data, int prior, int next) : data(data), prior(prior), next(next) {}
}list_[MAXN];
int cnt = 0, head = 0, rear = 0;
void Insert_L(int x) {
    list_[++cnt] = List(x, head, list_[head].next);
    list_[list_[head].next].prior = cnt;
    list_[head].next = cnt;
    if (!rear)
        rear = cnt;
}
void Insert_R(int x) {
    list_[++cnt] = List(x, rear, -1);
    list_[rear].next = cnt;
    rear = cnt;
}
void Delete(int k) {
    if (!(k != rear))
        rear = list_[k].prior;
    else {
        list_[list_[k].prior].next = list_[k].next;
        list_[list_[k].next].prior = list_[k].prior;
    }
}
void Insert_IL(int k, int x) {
    list_[++cnt] = List(x, list_[k].prior, k);
    list_[list_[k].prior].next = cnt;
    list_[k].prior = cnt;
}
void Insert_IR(int k, int x) {
    list_[++cnt] = List(x, k, list_[k].next);
    list_[list_[k].next].prior = cnt;
    list_[k].next = cnt;
    if (!(rear != k))
        rear = cnt;
}
int main() {
    char op;
    int n, k, x;
    scanf("%d", &n);
    while (n--) {
        scanf(" %c", &op);
        switch (op) {
            case 'L': scanf("%d", &x); Insert_L(x); break;
            case 'R': scanf("%d", &x); Insert_R(x); break;
            case 'D': scanf("%d", &k); Delete(k); break;
            default: scanf("%c%d%d", &op, &k, &x);
                if (op != 'R') Insert_IL(k, x);
                else Insert_IR(k, x); break;
        }
    }
    int p = list_[head].next;
    while (~p) {
        printf("%d ", list_[p].data);
        p = list_[p].next;
    }
    printf("\n");
    return 0;
}
全部评论

相关推荐

11-07 03:09
深圳大学 C++
实习秋招做的很差,也想总结一下自己的大学生涯吧。不算太摆,但是很迷。0.大学前高考发挥超常,才来到深大计软。大学前暑期基本上都是玩游戏了。接触了python(李笑来)但是没接触到online&nbsp;judge,也没去多了解编程生态、计算机行业。背了背单词,但是没去规划指标如六级,没制定计划不了了之。1.大一军训时去了校ACM培训,当时dev编译器都不会下载。军训期间积极看B站大学c语言课程。力扣,牛客都是知道的,但是没有成为很好的跳板。第二次培训,看不懂cpp的&nbsp;cin&amp;gt;&amp;gt;,网上搜了也没搞懂,再加上周末跟训得三个多小时,感觉跟不上放弃了。自费报了蓝桥杯,混了省二跟着一些机构课程学习,走的cpp路线。暑假在linux上熟悉vim操作。2.大二朝花夕拾,又去参加ACM训练,跟了一年,寒假都在码&nbsp;带懒标记的线段树。codeforce和力扣赛都在打打(竞赛还是有趣的)。集训队入队周赛打四场,校赛拿金,面试时表现差,说自己想就业,遂挂。当时四月多,2024华为软件精英挑战赛也在打,拿了80名(前64才有三等奖)。蓝桥杯国二。很多晚上跑步来消磨时间。3.大三上修了深大最强的计算机图形学,408找实习,投简历了说自己只有周末有空,遂没在找。也没看牛客真实行情。寒假随便做了个日志器,属于混过去了。当时接到字节的面试(人生处女面),前一天觉都睡不好,很紧张,手撕做的不好,话都说不利索了。面评脏。大三下找实习,cpp选手,没有很好经历、项目,运气好去了学校附近中厂实习。4.大四现在,貌似对开发不上心?没有好的offer(甚至hot100不会做)其实同届好多同学都拿的不错。还有保研C9的。嗯,考研吧。————对自己行为的分析:a.应试教育+应试家庭教育,我的个性是固执、遵规守矩的。b.还有莫名的孤独,明明有很多朋友,但还是没有很好的内驱力,没有坚定的理想。c.自己没有很好的调研、探索和规划能力。大家也可以锐评一下😊
_Matrice_:差不多的性格,不然不会本科时硬杠cpp(那个时候还没有大模型,啃完一整本primer和习题,还是做不出来什么东西),还找不到方向,相比之下学习一些应用层的同学已经能够参考别人的方法做出实用的应用了。学东西,找实习,感觉更多地是出于和别人比较,而不是自我内驱。不过...正如deft所说,人生不需要他人的建议,所以也没有标准化的路径,在能够自食其力的背景下慢慢找到自己的生活方式吧...。另外面试很多时候看运气、眼缘
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务