当前位置:   article > 正文

826. 单链表_实现一个单链表,链表初始为空,支持三种操作: 1.向链表头插入一个数; 2.删除第 k

实现一个单链表,链表初始为空,支持三种操作: 1.向链表头插入一个数; 2.删除第 k

题目描述

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

(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

1.单链表的简单介绍

单链表是一种链式存取的数据结构,用一组任意地址空间(地址空间即存储单元)来存放线性表的数据元素。单链表中的数据是以节点的形式来表示,而节点是用结构体来描述,每个节点都是由元素和指针构成,即该结构体中包含两个成员变量:存放元素的成员变量和存放下一个节点地址的成员变量。

2.顺序表与链表的区别

顺序表的特点为:逻辑相邻的两节点其物理地址也是相邻的;链表的特点为:逻辑相邻的两节点其物理地址不相邻。顺序表的存储方式是:节点元素连续存放在存储单元;链表的存储方式是:节点元素随机存放在存储单元。

链表的插入和删除操作:
代码如下:

#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int head;  //表示头结点
int idx;  //表示当前是第几个数
int e[N]; //表示第i个数所存储的值
int ne[N]; //i的下一个节点
void init()
{
    head = -1;  //初始化
    idx = 0;  //下标从0开始
}
//插入到头结点
//1.先用e[idx]存储该值
//2.将ne[idx]即第idx个数的下一个节点指向头结点
//3.头结点head更新为idx;
//4.idx++;
void add_to_head(int x)
{
    e[idx] = x, ne[idx] = head, head = idx, idx++;  
}
// 将x插入到第k个数的后面
//1.先用e[idx]存储该值x
//2.将ne[idx]即第idx个数的下一个节点指向第k个数的下一个节点
//3.将ne[k]指向idx;
//4.idx++;
void add(int k, int x)
{
    e[idx] = x, ne[idx] = ne[k], ne[k] = idx, idx++;
}
//删除第k个数后面的数
//直接让ne[k] = ne[ne[k]]即可
void move(int k)
{
    ne[k] = ne[ne[k]];
}
int main()
{
    int t;
    init();
    cin >> t;
    while(t--){
        char c;
        int k, x;
        cin >> c;
        if(c == 'H'){
            cin >> x;
            add_to_head(x);
        }
        else if(c == 'D'){
            cin >> k;
            if(!k)head = ne[head];  //如果k == 0, 要删除头结点,即让head等于下一个节点
            else move(k - 1);
        }
        else if(c == 'I'){
            cin >> k >> x;
            add(k - 1, x);
        }
    }
    for(int i = head; i != -1; i = ne[i])
        cout << e[i] << ' ' ;
    cout << endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/728091
推荐阅读
相关标签
  

闽ICP备14008679号