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 }

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

你可能感兴趣的:(list)