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 }

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

时间: 2024-10-08 06:49:52

PAT 1074. Reversing Linked List的相关文章

PAT 1074. Reversing Linked List (25)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L.  For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6. Input Specifica

PAT 1074 Reversing Linked List[链表][一般]

1074 Reversing Linked List (25)(25 分) Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you mus

pat(A)1074. Reversing Linked List(哈希)

1.没看到reverse the links of every K elements on L这一句,WA到死. 2.代码: #include<iostream> #include<cstring> #include <algorithm> #include<cstdio> using namespace std; struct Node { int d; int next; void init(int x,int y) { d=x; next=y; } }

PAT (Advanced Level) 1074. Reversing Linked List (25)

简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using namespace std; const int maxn=100000+10

【PAT甲级】1074 Reversing Linked List (25 分)

题意: 输入链表头结点的地址(五位的字符串)和两个正整数N和K(N<=100000,K<=N),接着输入N行数据,每行包括结点的地址,结点的数据和下一个结点的地址.输出每K个结点局部反转的链表. trick: 测试点6包含一些不在起点这条链表上的结点. 代码: #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;map<string,pair<int,string> >

1074. Reversing Linked List (25)

reverse 方法很好用 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then yo

1074 Reversing Linked List (25 分)

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6. Input Specification:

1074 Reversing Linked List

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6. Input Specification:

1074 Reversing Linked List (25分) 链表反转

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6. Input Specification: