算法-链表

题目一

826. 单链表

 

解题思路

不使用结构体&指针链表的原因:new函数效率很低,在输入大量数据时会导致超时

故使用两个数组模拟链表在内存中的运行逻辑

55289_e1971847d8-1.png

 

55289_e9748881d8-11.png

 

代码模板

#include <iostream>
using namespace std;
const int N = 100010;

int value[N],ne[N],head=-1,index=0;

void add_to_head(int x)
{
    value[index]=x;
    ne[index]=head;
    head=index;
    index++;
}

void remove(int k)
{
    ne[k]=ne[ne[k]];
}

void insert(int k,int x)
{
    value[index]=x;
    ne[index]=ne[k];
    ne[k]=index;
    index++;
}
int main()
{
    int m;
    cin>>m;
    while(m--)
    {
        char M;
        int k,x;
        cin>>M;
        if(M=='H')
        {
            cin>>x;
            add_to_head(x);
            
        }
        else if(M=='D')
        {
            cin>>k;
            if(k==0)head=ne[head];
            remove(k-1);
        }
        else if(M=='I')
        {
            cin>>k>>x;
            insert(k-1,x);
        }
    }
    for(int i=head;~i;i=ne[i])
    printf("%d ",value[i]);
    return 0;
}

题目二

 

解题思路

使用index 0和1 作为双链表的两端点,读入参数的index初始值为2

add函数利用双链表的特性简化为传参实现不同功能

其余用数组模拟指针地址来模拟链表

注意双链表不仅要更改左值,还要更改另一个方向的值。

代码模板

#include<iostream>

using namespace std;

const int N = 1e5 + 10;

int m;
int value[N],ne[N],lst[N],index;

void init()
{
    index=2;
    ne[0]=1;
    lst[1]=0;
}
void add(int k,int x)
{
    value[index]=x;
    ne[index]=ne[k];
    lst[index]=k;
    lst[ne[k]]=index;
    ne[k]=index;
    index++;
}

void remove(int k)
{
    lst[ne[k]]=lst[k];
    ne[lst[k]]=ne[k];
}

int main()
{
    init();
    scanf("%d",&m);
    while(m--)
    {
        string t;
        int k,x;
        cin>>t;
        if(t=="L"){
            cin>>x;
            add(0,x);
        }
        else if(t=="R"){
            cin>>x;
            add(lst[1],x);
        }
        else if(t=="D")
        {
            cin>>k;
            remove(k+1);
        }
        else if(t=="IL")
        {
            cin>>k>>x;
            add(lst[k+1],x);
        }
        else if(t=="IR")
        {
            cin>>k>>x;
            add(k+1,x);
        }
    }
    for(int i=ne[0];i!=1;i=ne[i])
    printf("%d ",value[i]);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值