单链表学习

发布于:2024-04-07 ⋅ 阅读:(94) ⋅ 点赞:(0)

//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速

//初始化,头节点为空

//将x插入到头节点

//将x插到结点k的后面

//将下标k的后面的点删掉

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>

using namespace std;
//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速
const int N = 100010;
int head;//头指针位置
int e[N];//表示结点i的值是多少
int ne[N];//结点i的下一个节点
int idx;//存储当前已经用到哪个地址
//初始化,头节点为空
void init(){
    head = -1;
    idx = 0;
}
//将x插入到头节点
void add(int x){
    e[idx] = x;
    ne[idx] = head;
    head = idx;//head指向idx指针
    idx++;
}
//将x插到结点k的后面
void addkx(int k,int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}
//将下标k的后面的点删掉
void deletek(int k){
    ne[k] = ne[ne[k]];
}

例题:826. 单链表

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>

using namespace std;
//静态链表,只往后看,找前面必须遍历
//算法题用数组解题更快速
const int N = 100010;
int head;//头指针位置
int e[N];//表示结点i的值是多少
int ne[N];//结点i的下一个节点
int idx=1;//存储当前已经用到哪个地址
//初始化,头节点为空
void init(){
    head = -1;
    idx = 0;
}
//将x插入到头节点
void add(int x){
    e[idx] = x;
    ne[idx] = head;
    head = idx;//head指向idx指针
    idx++;
}
//将x插到结点k的后面
void addkx(int k,int x){
    e[idx] = x;
    ne[idx] = ne[k];
    ne[k] = idx;
    idx++;
}
//将下标k的后面的点删掉
void deletek(int k){
    ne[k] = ne[ne[k]];
}

int main()
{
	init();
    int n;
    scanf("%d",&n);
    
    while(n--){
        char op[2];
        scanf("%s",&op);
        if(op[0] == 'H'){//在头节点后面插入
            int x;
            scanf("%d",&x);
            add(x);
        }
        if(op[0] == 'D'){//要特判删除头指针 
            int k;
            scanf("%d",&k);
            if(!k) head = ne[head]; 
            else deletek(k-1);
        }
        if(op[0] == 'I'){
            int x,k;
            scanf("%d%d",&k,&x);
            addkx(k-1,x);
        }
    }
    
    for(int i=head;i!=-1;i=ne[i]){
        printf("%d ",e[i]);
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到