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 }
02-线性结构3 Reversing Linked List (25 分)
猜你喜欢
转载自www.cnblogs.com/acoccus/p/10935554.html
今日推荐
周排行