1074. Reversing Linked List (25)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer, andNext is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
反转链表,但是此链表非彼链表。题目意思是说链表的节点由两个地址一个数值组成,给定一个数k,那么链表里面以k个节点为一组进行反转,但是要保证各节点之间的地址相连无误。
刚开始的思路是:用字符串来存储地址,因为地址一定是5位数,结果最后倒数第二个点会超时。看来读入一个类真的很费时间,后来改成了char[ ]虽然超时没了,但是判断起来还是很不方便。后来看了别人的代码发现这么个东西:printf("%05d",n);用5位长度输出一个数字,少的部分用0来填充。这样就可以用int来存地址,映射完全可以用数组来替代。
除了上述数据结构的简化,这个题目还有几点要注意:
【1】输入的点可能有无用的点,这些点要忽略。
【2】输出-1的时候前面没有0
【3】反转的时候节点本身的地址是不变的,但是下一个地址要变,这里我用了输出两次本次地址来替代。
【4】注意反转两轮及以上的情况。
Ac代码:
// pat-1074-ans.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"iostream"
#include"stdio.h"
#include "deque"
using namespace std;
class node{
public:
int addr;
int val;
int next;
node(int a,int v,int n):addr(a),val(v),next(n){}
node(){}
};
node an[100000];
deque<node> ans;
int time=0;
void output(deque<node>& ans)
{
if (time>0&&!ans.empty())
{
printf("%05d\n",ans.back().addr);
time--;
}
int index=ans.size()-2;
int temp=ans.back().next;
while (!ans.empty())
{
if (index==-1)//最后一个
{
printf("%05d",ans.back().addr);
printf(" %d ",ans.back().val);
time++;
}
else
{
printf("%05d",ans.back().addr);
printf(" %d ",ans.back().val);
if (ans.at(index).addr==-1)
{
printf("%d\n",ans.at(index).addr);
}else
printf("%05d\n",ans.at(index).addr);
}
ans.pop_back();
index-=1;
}
}
void output_front(deque<node>& ans)
{
if (time>0&&!ans.empty())
{
printf("%05d\n",ans.front().addr);
time--;
}
while (!ans.empty())
{
printf("%05d",ans.front().addr);
printf(" %d ",ans.front().val);
if (ans.back().next==-1)
{
printf("%d\n",ans.front().next);
}else
printf("%05d\n",ans.front().next);
ans.pop_front();
}
}
int main()
{
int n=0,k=0,head=0;
cin>>head>>n>>k;
int addr=0,val=0,next=0;
for (int i=0;i<n;i++)
{
cin>>addr>>val>>next;
an[addr].addr=addr;
an[addr].val=val;
an[addr].next=next;
}
int cnt=0;
int index=head;
bool apend=false;
while(cnt<n)
{
next=an[index].next;
node tempn;
tempn.addr=an[index].addr;
tempn.val=an[index].val;
tempn.next=next;
ans.push_back(tempn);
cnt++;
if (cnt%k==0)
{
output(ans);
}
if (next==-1)
{
if (ans.empty())
{
apend=true;
}
output_front(ans);
if (apend)
{
printf("-1\n");
}
break;
}
index=next;
}
return 0;
}