是我的错觉吗
直接把%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 需要对“翻转中间一部分链表”有透彻的理解并且加以引用(参考灵神)