逆转子序列的问题。
记得上姥姥网课的时候,姥姥说这个题内存参杂了不能直接排序的。
于是…………
我就先遍历了一边链表排除了多余的结点....
然后…………
逆序呀!
再然后链接整个表。输出。
正常算法要考虑的东西还是挺多的。
……………………更新线……………………
注意逆序的次数,要以在链表中的数据为准 不要直接用n了
邪道方法:
#include <iostream>
#include <vector>
#define MAX 100010
using namespace std;
struct Node {
int add;
int data;
int next;
};
Node l[MAX];
int st, n, k;
vector <Node> ans;
vector <Node> fin;
int main() {
cin >> st >> n >> k;
int add;
for (int i = 0; i < n; i++) {
scanf("%d", &add);
l[add].add = add;
scanf("%d %d", &l[add].data, &l[add].next);
}
int p = st;
while (p != -1) {
ans.push_back(l[p]);
p = l[p].next;
}
for (int i = 0; i < ans.size(); i+=k) {
if (i + k <= ans.size()) {
int tk = k;
p = i + k - 1;
while (tk--) {
fin.push_back(ans[p]);
p--;
}
}
else {
p = i;
while (p < ans.size()) {
fin.push_back(ans[p]);
p++;
}
}
}
for (int i = 0; i < fin.size() - 1; i++) {
fin[i].next = fin[i + 1].add;
}
fin[fin.size() - 1].next = -1;
for (int i = 0; i < fin.size(); i++){
if (fin[i].next != -1)
printf("%05d %d %05d\n", fin[i].add, fin[i].data, fin[i].next);
else
printf("%05d %d %d\n", fin[i].add, fin[i].data, fin[i].next);
}
return 0;
}
正常算法:
#include<iostream>
#include<iomanip>
#include <stdio.h>
int MaxSize = 100002;
using namespace std;
struct Node
{
int Serial; //数组序号
int Next;//下一个节点序号
};
typedef Node* List;
int ListCount(List L ,int Start)
{
int Num = Start;
int Count = 0;
while (L[Num].Next != -1)
{
Count++;
Num = L[Num].Next;
}
Count++;
return Count;
}
List CreateList(int N)
{
List OrgList = new Node[MaxSize]; //模拟内存空间数组
int Address = 0;
for (int i = 0; i < N; i++)
{
scanf("%d", &Address);
scanf("%d", &OrgList[Address].Serial);
scanf("%d", &OrgList[Address].Next);
}
return OrgList;
}
//打印数组
void PrintList(List L, int Start, int N)
{
int TempPtr = Start; //指向头节点
while (L[TempPtr].Next != -1)
{
cout << setfill('0') << setw(5) << TempPtr << " " << L[TempPtr].Serial << " " << setfill('0') << setw(5) << L[TempPtr].Next << endl;
TempPtr = L[TempPtr].Next;
}
if (L[TempPtr].Next == -1)
cout << setfill('0') << setw(5) << TempPtr << " " << L[TempPtr].Serial << " " << L[TempPtr].Next << endl;
}
int ReversingList(List & L, int K, int Start)
{
int NewBegin = Start;//要返回的头节点
int PreHead = MaxSize - 1;//是上一组链表逆转之后(Pre)的最后一个节点。
L[PreHead].Next = Start; //指向首节点,虚拟一个头节点。
int Count = ListCount(L, Start);
int RevTimes = Count / K;
int tag = 1;//标记第一段反转序列
while (RevTimes--)
{
int PtrNew = L[PreHead].Next;
int PtrOld = L[PtrNew].Next;
int Record = PtrNew;//指向这现链表的首节点,逆转完的最后一个节点
for (int i = 1; i < K; i++)
{
int PtrTemp = L[PtrOld].Next;
L[PtrOld].Next = PtrNew;
PtrNew = PtrOld;
PtrOld = PtrTemp;
}
L[L[PreHead].Next].Next = PtrOld;//现在该组链表逆转完的最后一个节点,指向下一组的首节点
L[PreHead].Next = PtrNew; //上组链表的最后一个节点,指向现在该组链表的头节点
PreHead = Record; //现在该组链表的最后一个点 最后下组链表的头节点
if (tag == 1)
{
NewBegin = PtrNew;
tag = 0;
}
}
return NewBegin;
}
int main()
{
int Start = 0, N = 0, K = 0;
cin >> Start >> N >> K;
List OrgList = CreateList(N);
int NewStart = ReversingList(OrgList, K, Start);
PrintList(OrgList, NewStart, N);
system("pause");
return 0;
}