当前位置:主页 > 查看内容

PAT (Basic Level) Practice1025 反转链表

发布时间:2021-07-23 00:00| 位朋友查看

简介:1025 反转链表 一、题目 给定一个常数 K 以及一个单链表 L请编写程序将 L 中每 K 个结点反转。例如给定 L 为 1→2→3→4→5→6K 为 3则输出应该为 3→2→1→6→5→4如果 K 为 4则输出应该为 4→3→2→1→5→6即最后不到 K 个元素不反转。 二、输入输出 输入……

1025 反转链表

一、题目

给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。

二、输入输出

输入格式

每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N ( ≤ 1 0 5 ≤10^5 105?? )、以及正整数 K ( ≤ N ≤N N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 ?1 表示。

接下来有 N 行,每行格式为

Address Data Next

其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。

输出格式

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

三、样例

输入样例

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

输出样例

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

四、题目分析

首先读入数据存入unordered_map,从头节点开始依次找到所有有效节点,存入向量。遍历向量,节点进入双端队列,每满k个,逆序存放人新的向量,最后未满k个的节点正序存放。按照格式输出lists向量。

五、代码

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int address;
    int value;
    int next;
};
struct no
{
    int address;
    int value;
};
vector<node> nodes;
unordered_map<int, node> ump;
deque<node> deq;
vector<no> lists;
int main()
{
    int first_address;
    int node_num;
    int k;

    cin >> first_address >> node_num >> k;
    for (int i = 0; i < node_num; i++)
    {
        node n;
        cin >> n.address >> n.value >> n.next;
        ump.insert(pair<int, node>(n.address, n));
    }
    node n;
    n.address = first_address;
    n.value = ump[first_address].value;
    n.next = ump[first_address].next;
    nodes.push_back(n);
    while (n.next != -1)
    {
        n.address = n.next;
        n.value = ump[n.address].value;
        n.next = ump[n.address].next;
        nodes.push_back(n);
    }
    ump.clear();
    for (int i = 0; i < nodes.size();)
    {
        for (int j = 0; j < k; j++)
        {
            node x = nodes[i];
            deq.push_back(x);
            i++;
            if (i == nodes.size())
                break;
        }
        if (deq.size() == k)
        {
            while (deq.size() != 0)
            {
                no y;
                y.address = deq.back().address;
                y.value = deq.back().value;
                lists.push_back(y);
                deq.pop_back();
            }
        }
    }
    while (deq.size() < k && deq.size())
    {
        no y;
        y.address = deq.front().address;
        y.value = deq.front().value;
        lists.push_back(y);
        deq.pop_front();
    }
    for (int i = 0; i < lists.size(); i++)
    {
        if (!i)
        {
            printf("%05d %d ", lists[i].address, lists[i].value);
        }
        else
        {
            printf("%05d\n%05d %d ", lists[i].address, lists[i].address, lists[i].value);
        }
    }
    printf("-1");
    return 0;
}

六、总结

unordered_map
头文件: #include < unordered_map >
unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。

;原文链接:https://blog.csdn.net/BlacKingZ/article/details/115769632
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐