数据结构(单链表,双链表)

单链表——数组模拟

单链表如果是用结构体去实现的话,需要一个指针域,和一个值域(最简单的单链表)一个指向下一个值的位置所在,一个储存当前的值

受此启发,我们也可以用数组对其进行模拟,用关联起来——我们可能回想这么做是否还有存在的必要,因为像c++的STL里面都是已经写好的,或者struct写不是更好?emmm确实如此,但是拿c++举例,c++的new其实是很慢的,所以用数组会更快(手写STL也是同理)

那么根据刚才的分析我们已经知道了我们需要什么了:

1.值域:e【n】。

2.指针域:next【n】。

 next里面储存下一个结点的下标。

好了,我们可以开始进行一个简单的链表的书写了。

void init()
{
    head=-1;//初始化头结点
    idx=0;//记录我们用到了哪个下标
}

 先初始化头结点,并用idx储存用到的下标

1.插入—头插法(插在头结点后面)

 让新结点指向head(head所存的就是第一个结点的下标(也就是地址)),让head指向新节点。

void add_head(int x)
{
    e[idx]=x;
    ne[idx]=head;
    head=idx++;
}

 1.插入—插到第k个插入的点的后面

由于我们的idx是记录用到的下标的值,但是我们的idx是从0开始的,所以第k个插入的数对应的就是k-1。

void add(int k,int x)
{
    e[idx]=x;
    ne[idx]=ne[k-1];
    ne[k-1]=idx++;
}

 

 那么插入是这么插入的,怎么删除呢?

1.删除

同理删除第k个结点其实是删除k-1。因为我们的idx是从0开始的

 

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

好了以上就是单链表的增加和删除,那么增删会了,怎么查呢?(会查就会改了哈哈哈)

很简单:

for(int i=head,i!=-1;i=ne[i])
{
    e[i]...
    ...
    ...
    ...
}

 

双链表——数组模拟

双链表其实就是在单链表上又增加了一层指针域,也就是前向的指针。

void init()
{
    r[0]=1;
    l[1]=0;
    idx=2;
}

1插入——头插法

void add_head(int x)
{
    l[idx]=0;//新节点->pre=head
    r[idx]=r[0];//新节点->next=head->next
    r[0]=idx;//head->next=新节点
    l[r[idx]]=idx;//新节点->next->pre=新节点
    e[idx++]=x;//add x
}

 

 2插入——尾插法

void add_tail(int x)
{
    r[idx]=1;//新节点->next=tail
    l[idx]=l[1];//新节点->pre=tail->pre
    r[l[1]]=idx;//新节点->pre->next=新节点
    l[1]=idx;//tail->pre=新节点
    e[idx++]=x;//add x
}

 删除

void delete_(int k)
{
    r[l[k]]=r[k];//k->pre->next=k->next
    l[r[k]]=l[k];//k->next->pre=k->pre
}

 在第k个点后插入也是和头插法和尾插法同理。

来源acwing

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值