单链表(链式向前星)

单链表算法

时间复杂度:插入删除O(1),查找O(n)

head指向的位置是头,-1的位置是尾部

题目:单链表

1、定义一个终止节点-1,开始head(头指针指向终止节点),idx为新节点的下标,该下标存放的是节点的相关信息。

在这里插入图片描述

2、在头插入新节点,即在idx下标存放相关信息的值,然后新节点的下一位指向头节点所在的位置,头节点移动到当前新节点,新节点的下标+1。

在这里插入图片描述

3、在第k个输入的数后面插入一个数,先在新节点idx下标先存放相关信息,使新节点的下一个节点指向第k节点所指向的下一个节点,再使第k节点下一个节点指向当前新节点

在这里插入图片描述

4、删除第k个输入的数后面的数,使第k个数指向下一个节点的下一个节点即可。

在这里插入图片描述

遍历从head开始,一直到-1。

结合代码自行理解

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
namespace IO{
    inline LL read(){
        LL o=0,f=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){o=o*10+c-'0';c=getchar();}
        return o*f;
    }
}using namespace IO;
const int N=1e5+7,M=2e4+7,INF=0x3f3f3f3f,mod=1e4;
int e[N],ne[N],head=-1,idx;
void Del(int k){
    ne[k]=ne[ne[k]];//第k个数指向
}
void Insert(int k,int x){
    e[idx]=x;//当前新节点的相关信息
    ne[idx]=ne[k];//新节点指向第k个数指向的下一个节点
    ne[k]=idx++;//第K个数指向新节点
}
void Insert_head(int x){
    e[idx]=x;//当前新节点的相关信息
    ne[idx]=head;//新节点指向头指针所指向的节点
    head=idx++;//头指针移动到当前新节点,idx再+1,创造新的节点
}
int main(){
    int n;
    scanf("%d",&n);
    char op[2];
    int k,x;
    for(int i=0;i<n;i++){
        scanf("%s",op);
        if(*op=='H'){//在表头插入一个数
            scanf("%d",&x);
            Insert_head(x);
        }else if(*op=='D'){//第k个数指向下一个节点的下一个节点
            scanf("%d",&k);
            if(k==0)head=ne[head];
            else Del(k-1);
        }else{//在第k个输入的数后面插入一个数x
            scanf("%d %d",&k,&x);
            Insert(k-1,x);
        }
    }
    for(int i=head;~i;i=ne[i]){
        printf("%d ",e[i]);
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值