题目要图
分析一下 重点是逆转K个节点倒序输出 而不是逆转链表上的节点
可以取巧 方法是逆转输出 也可以用逆转链表上的节点来做
本文采用的方式是取巧
#include <stdio.h>
#include <stdlib.h>
#define Maxsize 100005
int main()
{
int FirstAdd, N, K;
int Data[Maxsize], Next[Maxsize],List[Maxsize], Sum[Maxsize];
scanf("%d %d %d", &FirstAdd, &N, &K);
int i,sum,j,total,p,node = FirstAdd;
i = 0;
for (i = 0; i < N; i++)
{
int Address,data,next;
scanf("%d %d %d", &Address,&data, &next);
Data[Address] = data;
Next[Address] = next;
}
sum=0;total=0;
while(node != -1)
{
List[total++] = node;
node = Next[node];
}
int n = total / K;
for (i = 1; i <= n; i++) //设置K个节点成一个区间 K个区间就是K个循环
{
p = (i * K) - 1; //记录着K个节点组成的区间中最后一个节点的位置 因为数组从0计算故-1
for (int j = 0; j < K; j++)
{
Sum[sum] = List[p];
sum++;p--;
}
}
if (total - n * K)
{
int residue = total - (n * K);
p = total-residue;
for (i = 0; i < residue; i++)
{
Sum[p] = List[p];
p++;
}
}
for (i = 0; i < total-1; i++)
{
printf("%05d %d %05d\n",Sum[i],Data[Sum[i]],Sum[i+1]);
}
printf("%05d %d -1\n",Sum[i],Data[Sum[i]],Next[Sum[i]]);
getchar();
getchar();
return 0;
}
我的思路逻辑是从他人博客得到
非常感谢@叫我皮卡丘 博主能够为我解惑 以下是他的博客 其中有非常棒数学思想
https://blog.csdn.net/liyuanyue2017/article/details/83269991#comments_13566549
//Maxsize 为100002
-
我一共设计四个数组
1.Data[Maxsize]
2.Next[Maxsize]
3.List[total+2]
4.Sum[total+2]
3与4 数组大小可以是Maxsize 也可以是链表的节点个数+2 其实+1就可以了 也可以不加
我防止越界 加一下保守 -
随后用数组Data[Adrees] = dara Next[Adress] =next 这样子通过地址可以知道data
可以知道next
接下来将单链表上所有节点存入数组list 并且计数 因为他给的节点不全是在单链表上
会有多余的节点
随后我们按顺序存入数组list 这样子我们有了排序好的节点
在通过K与total 计算K个区间 在每个区间做个K次逆序 这样子就完成
输出要注意最后next要输出一个-1 所以要单独列出来!
重要的是从排序好的list数组 取出来重新逆转排好
list 和Sum数组中按顺序存放节点的地址 所以通过地址我们可以有序的输出
这是取巧的方法 如果你看到了这里请你最好不要使用这个方法老老实实去走逆转单链表节点的顺序吧!