2021.4.3双向链表

本文探讨了如何通过数组与链表实现数字操作,如设立a[]数组存储数字,以及使用left[]和right[]数组调整顺序。重点讲解了op1函数,涉及链表链接操作,以及op4过程中的反转计数。还提到了单向链表的基础概念和题目简化。
摘要由CSDN通过智能技术生成

紫薯。。不知道该投什么栏。侵删

移动盒子
题目

先设立一个a[]用于储存数字,然后声明一个next[]用于调换顺序。
或者使用left[] right[]来控制顺序。
具体的代码是

for(int i=1;i<=n;++i){
a[i]=i;
left[i]=i-1;
right[i]=i+1;
}
//left[n+1]=n;
right[0]=1;
right[n]=0;
left[0]=n;//为什么要设置0呢?

在后续的操作中(如op1)可能会使用到0,(若0=ly),此时第一位变为x
left[0]=n,是因为right[n]=0,这样形成一个闭环,才能够排序(起始点已知)。(op2,,ry=0,)

可以设置一个便于关联节点的函数

void link(int l,int r){
    right[l]=r;
    left[r]=l;
}

核心代码是3个函数,这里以op1为例。

void op1(int x,int y){//x,y本身就代表盒子x,y
    
    int lx=left[x];
    int rx=right[x];
    int ly=left[y];
    link(lx,rx);
    link(ly,x);
    link(x,y);
}

接下来是题意的简化,op4是一个很耗时的过程,所以可以用inv记录反转的次数,但同时要考虑反转时op1和op2是对调的,所以在调用函数时可以3-op。

附带一题,单向链表
题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值