//程序并没有真正对链表进行倒置,只是进行了倒置的输出,加上一些控制输出方式的语句
//k的值分几种情况
//1.k==1 2.k<=n 3.k>n
# include<stdio.h>
# include<algorithm>
# include<vector>
using namespace std;
struct Node
{
int address;
int next;
int data;
}node[100010];
vector<Node> ansTemp;
int main()
{
freopen("123.txt","r",stdin);
int head,n,k;
scanf("%d%d%d",&head,&n,&k);
int i;
for(i=0;i<n;i++)
{
int address;
int data;
int next;
scanf("%d%d%d",&address,&data,&next);
node[address].data = data;
node[address].next = next;
node[address].address = address;
}
int num=0;//得到循环运行次数
int point = head;//链表指针先指向头结点
bool is = false;//判断之前是否有元素输出
while(point!=-1)
{
ansTemp.push_back(node[point]);//把指针指向的当前元素加入临时数组
num++;
if(num==k)
{//如果已经是k个了
//反向输出各个元素
while(num)
{//并不是真正的修改位置,只是按要求输出
if(!is)
{//第一个元素需要正常输出
is = true;
printf("%05d %d ",ansTemp[ansTemp.size()-1].address, ansTemp[ansTemp.size()-1].data);
}
else
{//其他元素要输出自己的地址两次
printf("%05d\n",ansTemp[ansTemp.size()-1].address);
printf("%05d ",ansTemp[ansTemp.size()-1].address);
printf("%d ",ansTemp[ansTemp.size()-1].data);
}
ansTemp.pop_back();//弹出最后的元素
num--;
}
}
point = node[point].next;//找到下一个元素的位置;
}
if(!ansTemp.empty())
{//如果非空,则有剩余元素,按原样输出
for(i=0;i<ansTemp.size();i++)
{
if(is)
{//判断之前是否输出过数据,决定是否需要重复输出自己的地址
printf("%05d\n",ansTemp[i].address);
}
printf("%05d ",ansTemp[i].address);
printf("%d ",ansTemp[i].data);
is = true;
}
}
//还需要输出结尾地址 即-1
printf("-1\n");
return 0;
}
PAT B1025 反转链表 (25分)
最新推荐文章于 2022-07-21 20:45:22 发布