算法基础—数据结构—单链表

巧了我就是萌 提交于 2020-02-16 01:21:03

对于链表我想大家应该都不陌生,但是再算法里面,一般以静态链表为准(数组模拟链表)。主要是因为快。

这里总结了基本算法用到的一些模板,不出意外应该就这些,再看代码的时候希望画图理解qwq

// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;

//初始化
int intx(){
	head = -1;
	idx = 0;
}

// 在链表头插入一个数
int add_head(int x){
	e[idx] = x;
	ne[idx] = head;
	head = idx++;
}

//将头结点删除,保证头结点存在
int remove(){
	head = ne[head];
}

//在链表中插入一个数
int add(int k,int x){
	e[idx] = x;
	ne[idx] = ne[k];
	ne[k] = idx++;
	
} 

//再链表中删除一个数
int remove_d(int k){
	ne[k] = ne[ne[k]]
} 
 

直接根据题目来看吧。

https://www.acwing.com/problem/content/828/

题目要求就是根据不同的操作来模拟链表,最后遍历输出。

#include<bits/stdc++.h>
using namespace std;

const int N =1e5+9;
int e[N],ne[N],head,idx,n,x,k;
//head就是头结点下标
//idx类似于指针
//e[]表示结点的值
//nep[]表示结点的next值

//初始化
void intx(){
    head = -1;
    idx = 0;
}

//头插入
int add(int x){
    e[idx] = x;
    ne[idx] = head;
    head = idx++;
}

//中间插入
int int_add(int k,int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx++;
}

//删除
int delet(int k){
    ne[k] = ne[ne[k]];
}

int main(){
    cin >> n;
    intx();
    while(n--){
        char op;
        cin >> op;
        if(op=='H'){
            scanf("%d",&x);
            add(x);
        }
        if(op=='I'){
            scanf("%d%d",&k,&x);
            int_add(k-1,x);
        }
        if(op=='D'){
            scanf("%d",&k);
            if(k==0){
                head = ne[head];
            }
            delet(k-1);
        }
    }
    for(int i=head;i!=-1;i=ne[i]) printf("%d ",e[i]);
    printf("\n");
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!