02-线性结构3 Reversing Linked List (25分)

来源:互联网 发布:seo免费学习网 编辑:程序博客网 时间:2024/06/05 17:03
02-线性结构3 Reversing Linked List   (25分)

Given a constant KK and a singly linked list LL, you are supposed to reverse the links of every KK elements on LL. For example, given LL being 1→2→3→4→5→6, if K = 3K=3, then you must output 3→2→1→6→5→4; if K = 4K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive NN (\le 10^5105) which is the total number of nodes, and a positive KK (\le NN) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then NN lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Nextis the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218

Sample Output:

00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 5 68237

68237 6 -1

这题花了一点时间,但是并不难,第一要注意有可能不是所有的节点都要用到,所以有可能最后输出小于给出的节点。后来想到可以用reverse直接做的,然后下个节点的地址也可以不用存储,最后再输出。这个代码很粗糙,下次再来优化。

#include<iostream>#include<cstdio>using namespace std;struct node{int address;int key;int next;}a[100005],b[100005],c[100005];int main(){int ad;int m,n;cin>>ad>>n>>m;for(int i=0;i<n;i++){node A;cin>>A.address>>A.key>>A.next;a[A.address]=A;}int k=1;long temp=ad;while(a[temp].next!=-1){b[k++].address=temp;b[k-1].key=a[temp].key;b[k-1].next=a[temp].next;temp=a[temp].next;}b[k].address=a[temp].address;b[k].key=a[temp].key;b[k].next=-1;int t=0;int i;for(i=1;i*m<=k;i++){for(int j=i*m;j>(i-1)*m;j--){c[t++].address=b[j].address;c[t-1].key=b[j].key;}}for(int j=(i-1)*m+1;j<=k;j++){c[t++].address=b[j].address;c[t-1].key=b[j].key;}  for(int q=0;q<k-1;q++){c[q].next=c[q+1].address;}c[k-1].next=-1;for(int q=0;q<k-1;q++){printf("%05ld %d %05ld\n",c[q].address,c[q].key,c[q].next);}printf("%05ld %d %d\n",c[k-1].address,c[k-1].key,-1);return 0;}


0 0
原创粉丝点击