PAT A1133

题意

	给出一个链表,要求负数值排在非负之前,[0,K]之间的数在前面,所有值原始顺序不变。

代码

  1. 分成三块分别存储结点,注意每块的结点数目都可能为0,所以会对每一块最后一个结点的next有影响。
  2. 更简单的写法是使用vector分块存储,最后合并直接输出,不用判断。
1. 原始代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100010;

struct node {
  int data;
  int address;
  int next;
} Node[maxn], negative_num[maxn], greater_num[maxn], positive_num[maxn];
int K;

int main() {
  int st, n;
  cin >> st >> n >> K;
  for (int i = 0; i < n; ++i) {
    int data, address, next;
    scanf("%d", &address);
    scanf("%d%d", &Node[address].data, &Node[address].next);
    Node[address].address = address;
  }
  int p = st, cnt1 = 0, cnt2 = 0, cnt3 = 0, order = 1;
  while (p != -1) {
    Node[p].order = order++;
    if (Node[p].data < 0) negative_num[cnt1++] = Node[p];
    else if (Node[p].data <= K) positive_num[cnt2++] = Node[p];
    else greater_num[cnt3++] = Node[p];
    p = Node[p].next;
  }
  //输出负数
  if (cnt1 != 0) {
    for (int i = 0; i < cnt1 - 1; ++i) {
      printf("%05d %d %05d\n", negative_num[i].address, negative_num[i].data, negative_num[i + 1].address);
    }
    //处理最后一位
    if (cnt2 != 0) { //cnt2不为0,cnt1的最后一个结点的next为cnt2[0]
      printf("%05d %d %05d\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data, positive_num[0].address);
    } else {
      if (cnt3 == 0) { //cnt2 cnt3 都为0 直接返回
        printf("%05d %d -1\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data);
        return 0;
      } else {  //cnt3不为0 cnt1最后一个为cnt3[0]
        printf("%05d %d %05d\n", negative_num[cnt1 - 1].address, negative_num[cnt1 - 1].data, greater_num[0].address);
      }
    }
  }
  //输出[0,K]
  if (cnt2 != 0) {
    for (int i = 0; i < cnt2 - 1; ++i) {
      printf("%05d %d %05d\n", positive_num[i].address, positive_num[i].data, positive_num[i + 1].address);
    }
    if (cnt3 != 0) {
      printf("%05d %d %05d\n", positive_num[cnt2 - 1].address, positive_num[cnt2 - 1].data, greater_num[0].address);
    } else {
      printf("%05d %d -1\n", positive_num[cnt2 - 1].address, positive_num[cnt2 - 1].data);
      return 0;
    }
  }
  //输出>K
  if (cnt3 != 0) {
    for (int i = 0; i < cnt3; ++i) {
      if (i != cnt3 - 1) {
        printf("%05d %d %05d\n", greater_num[i].address, greater_num[i].data, greater_num[i + 1].address);
      } else {
        printf("%05d %d -1\n", greater_num[i].address, greater_num[i].data);
        return 0;
      }
    }
  }

}
2. 修改后
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 100010;

struct node {
  int data;
  int address;
  int next;
  int order;
} Node[maxn], ans[maxn], negative_num[maxn], greater_num[maxn], positive_num[maxn];
int K;
//bool cmp(node Node, node b) {
//  if (Node.order != b.order) {
//    if(Node.order<b.order) return Node.data <= K;
//  } else {
//    return
//  }
//}

int main() {
  int begin, n;
  vector<node> v, ans;
  cin >> begin >> n >> K;
  for (int i = 0; i < n; ++i) {
    int data, address, next;
    scanf("%d", &address);
    scanf("%d%d", &Node[address].data, &Node[address].next);
    Node[address].address = address;
  }
  for (; begin != -1; begin = Node[begin].next) {
    v.push_back(Node[begin]);
  }
  for (int i = 0; i < v.size(); i++) {
    if (v[i].data < 0) ans.push_back(v[i]);
  }
  for (int i = 0; i < v.size(); i++) {
    if (v[i].data >= 0 && v[i].data <= K) ans.push_back(v[i]);
  }
  for (int i = 0; i < v.size(); i++) {
    if (v[i].data > K) ans.push_back(v[i]);
  }
  for (int i = 0; i < ans.size() - 1; i++)
    printf("%05d %d %05d\n", ans[i].address, ans[i].data, ans[i + 1].address);
  printf("%05d %d -1\n", ans[ans.size() - 1].address, ans[ans.size() - 1].data);
  return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值