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

 1 #include <cstdio>
 2 #define Null -1
 3 
 4 const int maxn = 1e5+2;
 5 struct Node {
 6     int data;
 7     int addr, next;
 8 } Lst[maxn];
 9 
10 
11 
12 int input(int , int);
13 int change(int k, int first);
14 void printList(int first);
15 bool rearCheck(int k, int start);
16 int reverse(int head, int k);
17 
18 int main() {
19     int first, n, k;
20     scanf("%d%d%d", &first, &n, &k);
21     
22     int head = input(n, first);
23     int NewStart = change(k, head);
24     printList(NewStart);
25     
26     return 0;
27 }
28 int input(int n, int first) {
29     for(int i=0; i<n; i++) {
30         int taddr;
31         scanf("%d", &taddr);
32         scanf("%d%d", &Lst[taddr].data, &Lst[taddr].next);
33         Lst[taddr].addr = taddr;
34     }
35     int p = 100000;
36     Lst[p].next = first;
37     return p;
38 }
39 
40 int change(int k, int head) {
41     int tmp = head;
42     while( rearCheck(k, tmp) ) {
43         Lst[tmp].next = reverse(tmp, k);
44         
45         for(int i=0; i<k; i++) {
46             tmp = Lst[tmp].next;
47         }
48         
49     }
50     return head;
51 }
52 
53 bool rearCheck(int k, int start) {
54     int cnt = 0;
55     while( cnt < k+1 ) {
56         if(start == Null) break; 
57         start = Lst[start].next;
58         cnt++;
59     } 
60     
61     if(cnt == k+1) return true;
62     else return false;
63 }
64 
65 int reverse(int head, int k) {
66     int freshStart = Lst[head].next;
67     int origStart = Lst[freshStart].next;
68     int tmp;
69     
70     int cnt= 0;
71     while(cnt < k-1) {
72     
73         tmp = Lst[origStart].next;
74         Lst[origStart].next = freshStart;
75         freshStart = origStart;
76         origStart = tmp;
77         cnt++;
78         
79     }
80     Lst[Lst[head].next].next = origStart;
81     
82     return freshStart;
83 }
84 
85 
86 void printList(int p) {
87     p = Lst[p].next;
88     while(p!=-1) {
89         if(Lst[p].next != -1)
90             printf("%05d %d %05d\n", Lst[p].addr, Lst[p].data, Lst[p].next);
91         else     
92             printf("%05d %d -1\n", Lst[p].addr, Lst[p].data);
93         p = Lst[p].next;
94     }
95 }
AC

猜你喜欢

转载自www.cnblogs.com/acoccus/p/10935554.html