1074 Reversing Linked List (25 分)
思路
链表好坑,每k个要翻转一次,样例明显没有啊
而且还有游走的指针,不在链表内,需要统计合法链表内的指针个数
细节,就是开链表大小的结构数组去作为链表地址去存储,然后按照顺序给予他们一个rank,这里的rank可以通过结构体rank给予 或 使用rank数组进行标定
代码一(纯链表,加指针翻转)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int start ,n,k;
struct Node{
int address,data,next;
int order;
}nodes[maxn];
bool cmp(Node a, Node b)
{
return a.order<b.order;
}
int main(){
cin>>start>>n>>k;
for(int i = 0;i<maxn;i++){
nodes[i].order = maxn;
}
int add ;
for(int i = 0;i<n;i++)
{
cin>>add;
cin>>nodes[add].data>>nodes[add].next;
nodes[add].address = add;
}
int count = 0;
int p =start;
while( p != -1)
{
nodes[p].order =count++;
p=nodes[p].next;
}
sort(nodes,nodes+maxn,cmp);
if(k>count) k=count;
int ttt = k;
if(k>1)
{
while(ttt<=count)
{
int begin = nodes[ttt-1].next;
for(int i=ttt-1;i>ttt-k;i--)
nodes[i].next = nodes[i-1].address;
nodes[ttt-k].next = begin;
if(ttt+k <= count)
nodes[ttt-k].next = nodes[ttt+k-1].address;
for(int i=ttt-1;i>=ttt-k;i--)
{
if(nodes[i].next == -1)
printf("%05d %d %d\n",nodes[i].address,nodes[i].data,nodes[i].next);
else
printf("%05d %d %05d\n",nodes[i].address,nodes[i].data,nodes[i].next);
}
ttt+=k;
}
ttt-=k;
}
else{
ttt = 0;}
for(int i=ttt;i<count;i++)
{
if(nodes[i].next == -1)
printf("%05d %d %d\n",nodes[i].address,nodes[i].data,nodes[i].next);
else
printf("%05d %d %05d\n",nodes[i].address,nodes[i].data,nodes[i].next);
}
}
代码二(借助数组)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int start ,n,k;
int next_[maxn],data[maxn],rank_[maxn]={
0};
int main()
{
cin>>start>>n>>k;
int add;
for(int i=0;i<n;i++)
{
cin>>add;
cin>>data[add]>>next_[add];
}
int count = 0,p=start;
while(p!=-1)
{
rank_[count++] = p;
p = next_[p];
}
for(int i = 0;i<count-count%k;i+=k)
reverse(rank_+i,rank_+k+i);
for(int i=0;i<count-1;i++)
printf("%05d %d %05d\n",rank_[i],data[rank_[i]],rank_[i+1]);
printf("%05d %d -1\n",rank_[count-1],data[rank_[count-1]]);
}