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; }