1075. 链表元素分类(25)

原题: https://www.patest.cn/contests/pat-b-practise/1075

思路: 这题真实把控制打印顺序用到了, 极致. 题目本身不是很复杂, 开个10万
的结构体, 然后进行3波遍历, 把需要的数据打印出来就可以. 关键就是控制打印
顺序. 主要就是仔细分析, 感觉我的代码复用性不好.

实现:

#include <stdio.h>

#define LEN 100010
struct Node {
    int data;
    int next;
};
typedef struct Node s_node;
s_node node[LEN];

int main (void) {
    int faddr;
    int len;
    int k;
    int taddr;
    int tdata;
    int tnext;
    int first1 = 1;
    int first2 = 1;
    int first3 = 1;
    int p;
    int i;

    scanf("%d %d %d", &faddr, &len, &k);
    for (i = 0; i < len; i++) {
        scanf("%d %d %d", &taddr, &tdata, &tnext);
        node[taddr].data = tdata;
        node[taddr].next = tnext;
    }

    // 第一波遍历, 打印 < 0 的数据
    p = faddr;
    while (p != -1) {
        if (node[p].data < 0) {
            if (first1 == 1) {
                printf("%05d %d", p, node[p].data);
                first1 = 0;
            } else {
                printf(" %05d\n", p);
                printf("%05d %d", p, node[p].data);
            }
        }
        p = node[p].next;
    }

    // 第2波遍历, 打印 [0, k] 的数据
    p = faddr;
    while (p != -1) {
        if (node[p].data >= 0 && node[p].data <= k) {
            if (first1 == 0 && first2 == 1) {
                printf(" %05d\n", p);
            }
            if (first2 == 1) {
                printf("%05d %d", p, node[p].data);
                first2 = 0;
            } else {
                printf(" %05d\n", p);
                printf("%05d %d", p, node[p].data);
            }
        }
        p = node[p].next;
    }

    // 第3波遍历, 打印 > k 的数据
    p = faddr;
    while (p != -1) {
        if (node[p].data > k) {
            if (
                // 这个补刀有2种情况, 是测试点4
                (first2 == 0 && first3 == 1) ||
                (first2 == 1 && first1 == 0 && first3 == 1)
            ) {
                printf(" %05d\n", p);
            }
            if (first3 == 1) {
                printf("%05d %d", p, node[p].data);
                first3 = 0;
            } else {
                printf(" %05d\n", p);
                printf("%05d %d", p, node[p].data);
            }
        }
        p = node[p].next;
    }
    printf(" -1\n"); // 20171125 1634 第1波刷题结束!

    return 0;
}

转载于:https://www.cnblogs.com/asheng2016/p/7898401.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题目要求我们将一个链表中的元素按照奇偶性成两个链表,其中奇数链表中的元素顺序与原链表中的顺序相同,偶数链表中的元素顺序与原链表中的顺序相反。 我们可以使用两个指针别指向奇数链表和偶数链表的尾部,然后遍历原链表,将奇数节点插入奇数链表的尾部,偶数节点插入偶数链表的头部。最后将偶数链表反转即可。 具体实现可以参考以下代码: ```cpp #include <iostream> #include <vector> using namespace std; struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* createList(vector<int>& nums) { ListNode* head = new ListNode(0); ListNode* p = head; for (int num : nums) { p->next = new ListNode(num); p = p->next; } return head->next; } void printList(ListNode* head) { while (head) { cout << head->val << " "; head = head->next; } cout << endl; } ListNode* oddEvenList(ListNode* head) { if (!head || !head->next) return head; ListNode* oddTail = head; ListNode* evenHead = head->next; ListNode* evenTail = evenHead; while (evenTail && evenTail->next) { oddTail->next = evenTail->next; oddTail = oddTail->next; evenTail->next = oddTail->next; evenTail = evenTail->next; } oddTail->next = evenHead; ListNode* p = evenHead; ListNode* q = NULL; while (p) { ListNode* tmp = p->next; p->next = q; q = p; p = tmp; } evenHead = q; oddTail->next = evenHead; return head; } int main() { vector<int> nums = {1, 2, 3, 4, 5}; ListNode* head = createList(nums); printList(head); head = oddEvenList(head); printList(head); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值