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 }

卧槽,敢再无聊点么,输入节点数据竟然有不含在链表里的节点数据。

posted @ 2015-03-09 00:57  卖程序的小歪  阅读(147)  评论(0编辑  收藏  举报