1074. Reversing Linked List 解析

来源:互联网 发布:700套微信小游戏源码 编辑:程序博客网 时间:2024/05/20 03:47

逆转子序列的问题。

记得上姥姥网课的时候,姥姥说这个题内存参杂了不能直接排序的。

于是…………

我就先遍历了一边链表排除了多余的结点....

然后…………

逆序呀!偷笑偷笑

再然后链接整个表。输出。

正常算法要考虑的东西还是挺多的。

……………………更新线……………………

注意逆序的次数,要以在链表中的数据为准 不要直接用n了

邪道方法:

#include <iostream>#include <vector>#define MAX 100010using 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);elseprintf("%05d %d %d\n", fin[i].add, fin[i].data, fin[i].next);}return 0;}


正常算法:

#include<iostream>#include<iomanip>#include <stdio.h>intMaxSize = 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;}


0 0
原创粉丝点击