• 单链表


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

    (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)。

    输出格式

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

    数据范围

    1M1000001≤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

    用数组模拟单链表的好处:用数组模拟单链表比用结构体以及指针模拟单链表的速度要快很多,在解决算法题的时候会节省大量的时间。
    思路:用idx来存储插入单链表的元素的下标,idx初始为0.比如(idx = 1 的点表示第一个插入的点)。用head = -1表示单链表为空。e[N]数组存储元素值,
    ne[N]数组存储该元素的下一个元素的下标值。
    代码如下~
     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 const int N = 1e5 + 10;
     6 
     7 int head, m , idx;
     8 
     9 int e[N],ne[N];
    10 //单链表的创建,idx是使用者所操作的点的坐标
    11 void init(){
    12     head = -1;
    13     idx = 0;
    14 }
    15 
    16 void add_to_head(int x){
    17     e[idx] = x;  //创建该点
    18     ne[idx] = head;//将我们新创建的点指向头指针原来指向的点
    19     head = idx ++;
    20 }
    21 
    22 void remove(int k){
    23     ne[k - 1] = ne[ne[k - 1]];  //删除下标是k-1,即第k个点的后一个点
    24 }
    25 
    26 void insert(int k , int x){
    27     e[idx] = x;
    28 
    29     ne[idx] = ne[k - 1];//让我们新创建的点指向第k个点的下一个点
    30 
    31     ne[k - 1] = idx ++;//让第k个点指向我们新创建的点
    32 }
    33 
    34 int main(){
    35 
    36     cin>>m;
    37 
    38     init();
    39 
    40     while(m --){
    41 
    42         char c;
    43         cin>>c;
    44         int x , k;
    45 
    46         if(c == 'H'){
    47             cin >> x;
    48             add_to_head(x);
    49         }
    50         else if(c == 'D'){
    51 
    52             cin >> k;
    53             if(k == 0) head = ne[head];//判断如果删除的是头结点的情况
    54             remove(k);
    55 
    56         }
    57         else{
    58 
    59             cin >> k >> x;
    60             insert(k,x);
    61         }
    62 
    63     }
    64 
    65     for(int i = head ; i != -1; i = ne[i]) printf("%d ",e[i]);
    66 
    67     return 0;
    68 }
    View Code
    
    

    ~~~如若有不足之处,希望您私信我,好让我加以改正,蟹蟹~~

     
  • 相关阅读:
    分库分表(1) --- 理论
    Elasticsearch(10) --- 内置分词器、中文分词器
    Elasticsearch(9) --- 聚合查询(Bucket聚合)
    Elasticsearch(8) --- 聚合查询(Metric聚合)
    Elasticsearch(7) --- 复合查询
    Elasticsearch(6) --- Query查询和Filter查询
    Elasticsearch(5) --- 基本命令(集群相关命令、索引CRUD命令、文档CRUD命令)
    第二周 Word版面设计
    第六周 Word目录和索引
    第五周 Word注释与交叉引用
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/12267228.html
Copyright © 2020-2023  润新知