PAT 乙级 1025 反转链表
1. 题目简述及在线测试位置
1.1 举个栗子:1 2 3 4 5 6 ,反转四个元素后就是 4 3 2 1 5 6
1.2 在线测试位置:PAT 1025 反转链表
2. 基本思路
之前写过了,请参考Reversing Linked List 解题思路分析
3. 完整AC代码
#include <iostream>
using namespace std;
#define MAX 1000000
#define END -1
typedef int ElementType;
typedef int Address;
struct Node
{
ElementType Data;
Address Next;
}a[MAX];
Address Reverse(Address Position, int ReversedNumber);
void Print(int n);
int First, Number, ReversedNumber; //链表首地址、待输入的记录条数、翻转数
bool Flag = true; //记录是否首次翻转
int main()
{
cin >> First >> Number >> ReversedNumber;
Address Current,Next; ElementType Data;
Address Position; int Count=0;//Count 意味着 链表中的有效节点数
for (int i = 0; i < Number; i++) //存储输入数据
{
cin >> Current >> Data >> Next;
a[Current].Data = Data;
a[Current].Next = Next;
}
Position = First;
while (Position != END) //Number中可能存在无效结点,需要甄别出来,这是一个测试点
{
Count++;
Position = a[Position].Next;
}
int Mark = Count/ReversedNumber; //Mark是翻转链表的次数
Position = First;
while (Mark--) //翻转
Position = Reverse(Position, ReversedNumber);
Position = First;
while(Position !=END)//打印输出数据
{
Print(Position);
cout << " " << a[Position].Data << " ";
Print(a[Position].Next);
cout<< endl;
Position = a[Position].Next;
}
return 0;
}
Address Reverse(Address Position, int ReversedNumber)
{
Address Now, Next, Bak,PtrHead; //Bak=Next's Next
if (Flag)
Now = Position;
else
{
Now = a[Position].Next;
PtrHead = a[Position].Next;
}
Next = a[Now].Next;
Bak = a[Next].Next;
while (--ReversedNumber) //执行翻转
{
a[Next].Next = Now;
Now = Next;
Next = Bak;
Bak = a[Next].Next;
}
if (Flag) //首次翻转
{
a[Position].Next = Next;
First = Now;
Flag = false;
return Position;
}
else //非首次
{
a[PtrHead].Next = Next; //本段链表首地址元素改变指向 //链表绕来绕去好烦啊
a[Position].Next = Now;
return PtrHead;
}
}
void Print(int n)
{
int Scale = 10000;
if (n > 1)
{
while (n < Scale)
{
cout << "0";
Scale /= 10;
}
cout << n;
}
else if (n == 1)
cout << "00001";
else if (n == 0)
cout << "00000";
else if (n == END)
cout << "-1";
return;
}