zoukankan      html  css  js  c++  java
  • 单链表-模板题

    826. 单链表 

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

    (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

    #include<iostream>
    
    using namespace std;
    
    
    const int N = 1e5 + 50;
    int head,e[N],ne[N],idx;
    void init(){
    	head = -1;
    	idx = 0;
    }
    void head_add(int x){
    	e[idx] = x;
    	ne[idx] = head;
    	head = idx++;
    }
    void d_k(int k){
    	ne[k] = ne[ne[k]]; 
    }
    void add_k(int k,int x){
    	e[idx] = x;
    	ne[idx] = ne[k];
    	ne[k] = idx++;
    }
    
    int main(){
        int m,k;
        int n;
    	scanf("%d",&m);
    	char op[2];
    	init();
    	while(m --){
    		scanf("%s",op);
    		if(op[0] == 'H'){
    			scanf("%d",&n);
    			head_add(n);
    		}else if(op[0] == 'D'){
    			scanf("%d",&k);
    			if(!k) head = ne[head];
    			else d_k(k - 1);
    		}else {	
    			scanf("%d%d",&k,&n);
    			add_k(k - 1,n);
    		}
    	}
    	for(int i = head;i != -1;i = ne[i]) printf("%d ",e[i]);
        return 0;
    }
    

      

     
  • 相关阅读:
    前端页面获取各类页面尺寸及坐标尺寸总结
    禁止微信内置浏览器调整字体大小
    区分浏览器,判断浏览器版本
    JavaScript
    ASP.NET MVC,Entity Framework 及 Code First
    循序渐进MongoDB V3.4(Ubuntu)
    Webpack
    RequireJS Step by Step
    JavaScript Object 及相关操作
    ES6 Promises
  • 原文地址:https://www.cnblogs.com/luyuan-chen/p/11495255.html
Copyright © 2011-2022 走看看