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

本文主要探讨在算法中的静态链表操作,通过数组模拟链表以提高效率。作者分享了基本的链表操作模板,并建议读者在理解代码时结合图解。文章以一道具体题目为例,要求根据各种操作动态模拟链表并最终遍历输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这里总结了基本算法用到的一些模板,不出意外应该就这些,再看代码的时候希望画图理解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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值