zoukankan      html  css  js  c++  java
  • 单链表

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

    (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
    
    

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

     
  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/12267228.html
Copyright © 2011-2022 走看看