PAT 1074. Reversing Linked List
1 #include <cstdio> 2 #include <cstdlib> 3 #include <iostream> 4 #include <unordered_map> 5 6 using namespace std; 7 8 class Node { 9 public: 10 int data; 11 int next; 12 Node() : data(0), next(0) {} 13 Node(int d, int n):data(d), next(n){} 14 }; 15 16 int reverse_help(int head, int k, unordered_map<int, Node>& mem) { 17 if (head == -1) { 18 return -1; 19 } 20 21 int cur = head; 22 int prev= -1; 23 while (cur != -1) { 24 if (k == 0) { 25 break; 26 } 27 int tmp = mem[cur].next; 28 mem[cur].next = prev; 29 prev = cur; 30 cur = tmp; 31 32 k--; 33 } 34 mem[head].next = cur; 35 return prev; 36 } 37 38 int reverse(int head, int k, unordered_map<int, Node>& mem, int n) { 39 if (head == -1) { 40 return -1; 41 } 42 43 int nhead = -1; 44 int cur = head; 45 int pre = -1; 46 47 while (cur != -1) { 48 int t = reverse_help(cur, k, mem); 49 if (nhead == -1) { 50 nhead = t; 51 } 52 if (pre != -1) { 53 mem[pre].next = t; 54 } 55 pre = cur; 56 cur = mem[cur].next; 57 n -= k; 58 if (n < k) { 59 break; 60 } 61 } 62 63 return nhead; 64 } 65 66 void print(int head, unordered_map<int, Node>& mem) { 67 int cur = head; 68 while(cur != -1) { 69 Node& cnode = mem[cur]; 70 if (cnode.next != -1) { 71 printf("%05d %d %05d\n", cur, cnode.data, cnode.next); 72 } else { 73 printf("%05d %d %d\n", cur, cnode.data, cnode.next); 74 } 75 cur = mem[cur].next; 76 } 77 } 78 79 int count(int head, unordered_map<int, Node>& mem) { 80 int cnt = 0; 81 int cur = head; 82 while(cur != -1) { 83 cnt++; 84 cur = mem[cur].next; 85 } 86 return cnt; 87 } 88 89 int main() { 90 91 int head, n, k; 92 scanf("%d%d%d", &head, &n, &k); 93 94 unordered_map<int, Node> mem; 95 96 for (int i=0; i<n; i++) { 97 int addr, data, next; 98 scanf("%d%d%d", &addr, &data, &next); 99 mem.insert(make_pair(addr, Node(data, next))); 100 } 101 102 cout<<"===="<<endl; 103 print(head, mem); 104 cout<<"===="<<endl; 105 head = reverse(head, k, mem, count(head, mem)); 106 print(head, mem); 107 108 return 0; 109 }
卧槽,敢再无聊点么,输入节点数据竟然有不含在链表里的节点数据。