是我的错觉吗
直接把%d赋值给数组小标,不能把值副进去?
可是这样可以?
乱套了这
同样的代码
所以暂时将你眼睛闭了起来
所以还是好好老实两次赋值
。。。
写糊了已经
注意这句话
链表中部翻转:
不带dummy真的好麻烦且头大,我想投降了
在链表中段翻转时,除了中间的四部曲,还需要
1.原中段的dummy指向原中段末尾节点
2.原中段的第一节点指向原中段末尾节点的下一位
此外还要注意输出什么?是dummy的next,没错,每次都是dummy的next,因为dummy的next就是2中的原中段的第一节点,要的就是他,也只有这样表述
ac代码
//重开
#include<stdio.h>
#include<bits/stdc++.h>
#include <string>
const int N=100005;
int n,first,firstid;
using namespace std;
int head,k;
int lnxt[N];
int val[N];int p0=N-1;//dummy
int rvs(int k,int p)
{int pre=p;int cur=lnxt[p];int cur0=cur;//灵神 for(int i=0;i<k;i++){int nxt=lnxt[cur];lnxt[cur]=pre;pre=cur;cur=nxt;}lnxt[lnxt[p]]=cur;lnxt[p]=pre;return cur0;//灵神 }int main()
{//输入数据 scanf("%d %d %d",&head,&n,&k);lnxt[p0]=head;for(int i=0;i<n;i++){int idtemp;int valt,lnxtt;scanf("%d %d %d",&idtemp,&valt,&lnxtt);val[idtemp]=valt;lnxt[idtemp]=lnxtt;
}
//计算循环次数
int num_node=0;//一开始写的1,不对
for(int i=head;i>=0;i=lnxt[i]) num_node++;
int num_iter=num_node/k;
int dm=p0;
for(int i=0;i<num_iter;i++)
{
dm=rvs(k,dm);
}
int hd=lnxt[p0];
//rvs(k,p0);
//printf("%d %d %d",num_node,k,num_iter);
//int hd=p0;
while(hd!=-1)
{//printf("%d ",hd);hd=lnxt[hd];
if(lnxt[hd]==-1)printf("%05d %d %d\n",hd,val[hd],lnxt[hd]);
else printf("%05d %d %05d\n",hd,val[hd],lnxt[hd]);hd=lnxt[hd];
}}
acw上一位大佬 的:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX_N = 100010;
int ne[MAX_N];
int node[MAX_N];
int Reverse(int head, int k) {int rear = ne[head]; //反转后的最后一个结点int pL = ne[head]; //从头结点的下个结点开始翻转int pR = ne[pL];for (int i = 0; i < k - 1; i++) { //k个节点翻转k-1次int t = ne[pR];ne[pR] = pL;pL = pR;pR = t;}//将反转后的链表与未反转链表连起来ne[head] = pL;ne[rear] = pR;return rear; //返回翻转链表的最后一个节点
}
int main() {int head, p;int h, n, k;cin >> h >> n >> k;//创建空的头指针head = MAX_N - 1;ne[head] = h;for (int i = 0; i < n; i++) {int addr, data, nextAddr;cin >> addr >> data >> nextAddr;node[addr] = data;ne[addr] = nextAddr;}//统计有效链表的长度p = head;int cnt = 0;while (p != -1) {p = ne[p];cnt++;}n = cnt;//翻转链表p = head;for (int i = 0; i + k < n; i += k) p = Reverse(p, k);//打印链表p = ne[head];while (p != -1) {printf("%05d %d ", p, node[p]);if (ne[p] != -1) printf("%05d\n", ne[p]);else puts("-1");p = ne[p];}return 0;
}
总结:
1 真的需要dummy
2 需要对“翻转中间一部分链表”有透彻的理解并且加以引用(参考灵神)