1025 反转链表

这是一种套路题,要先记住大体流程,然后反复练习。

其中第一,二,三,四步是套路,第五步按题意处理结点,第六步结点信息的输出方式是套路。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100100;

struct Node {//第一步,定义结构静态链表 
    int address,data,next;
    int order = maxn;//第二步,初始化 
} node[maxn];
bool cmp(const Node& a,const Node& b) {
    return a.order < b.order;
}

int main() {
    int begin,n,k,address;
    cin>>begin>>n>>k;
    for(int i = 0; i < n; ++i) {
        cin>>address;
        node[address].address = address;
        cin>>node[address].data>>node[address].next;
    }
    int p = begin,cnt = 0;    //第三步,遍历链表,标记order,并统计有效节点个数
    while(p != -1) {
        node[p].order = cnt++;
        p = node[p].next;
    }
    sort(node,node+maxn,cmp);//第四步,按order对结点排序,把结点全部移到左边,使链表上结点的顺序与数组顺序一致 
    for(int i= 0; i < cnt - cnt%k; i+=k) {//第五步,按题意处理结点 
        reverse(node+i,node+i+k);
    }
    for(int i = 0; i < cnt; ++i) {//第六步,按题意输出结点信息 
        if(i < cnt - 1)
            printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);
        else
            printf("%05d %d -1\n",node[i].address,node[i].data);
    }
    return 0;
}

 

 

posted @ 2020-02-16 18:48  tangq123  阅读(112)  评论(0编辑  收藏  举报