首页 > 其他分享 >一千题,No.0089(链表元素分类)

一千题,No.0089(链表元素分类)

时间:2024-06-21 17:32:31浏览次数:25  
标签:一千 结点 int res elem 链表 add No.0089

给定一个单链表,请编写程序将链表元素进行分类排列,使得所有负值元素都排在非负值元素的前面,而 [0, K] 区间内的元素都排在大于 K 的元素前面。但每一类内部元素的顺序是不能改变的。例如:给定链表为 18→7→-4→0→5→-6→10→11→-2,K 为 10,则输出应该为 -4→-6→-2→7→0→5→10→18→11。

输入格式:

每个输入包含一个测试用例。每个测试用例第 1 行给出:第 1 个结点的地址;结点总个数,即正整数N (≤105);以及正整数K (≤103)。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。

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

Address Data Next

其中 Address 是结点地址;Data 是该结点保存的数据,为 [−105,105] 区间内的整数;Next 是下一结点的地址。题目保证给出的链表不为空。

输出格式:

对每个测试用例,按链表从头到尾的顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

输入样例:

00100 9 10
23333 10 27777
00000 0 99999
00100 18 12309
68237 -6 23333
33218 -4 00000
48652 -2 -1
99999 5 68237
27777 11 48652
12309 7 33218

输出样例:

33218 -4 68237
68237 -6 48652
48652 -2 12309
12309 7 00000
00000 0 99999
99999 5 23333
23333 10 00100
00100 18 27777
27777 11 -1

 解题思路:

首先用数组存储链表,然后遍历链表,创建3个容器,进行分类即可

最后我用了一个容器存储结果,是为了格式化输出,因为如果判断是否有输出比较麻烦

c++代码如下:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int data[100005] = {};
    int next[100005] = {};
    int begin,n,k;
    cin >> begin >> n >> k;
    vector<int> link1;//小于0
    vector<int> link2;//大于0,小于k
    vector<int> link3;//大于k
    //存储链表
    for(int i = 0;i < n;++i)
    {
        int add,d,nex;
        cin >> add >> d >> nex;
        data[add] = d;
        next[add] = nex;
    }

    //开始遍历链表,并分类
    int j = begin;
    while(j != -1)
    {
        int d,add;
        d = data[j];
        add = j;
        if(d < 0)
        {
            link1.push_back(add);
        }
        else if(d <= k)
        {
            link2.push_back(add);
        }
        else
        {
            link3.push_back(add);
        }
        j = next[j];
    }

    //将三个容器内的数据存到一起输出
    vector<int> res;
    for(auto &elem : link1)
    {
        res.push_back(elem);
    }
    for(auto &elem : link2)
    {
        res.push_back(elem);
    }
    for(auto &elem : link3)
    {
        res.push_back(elem);
    }

    //格式化输出
    for(auto & elem : res)
    {
        if(elem != *res.begin())
        {
            printf(" %05d\n",elem);
        }
        printf("%05d %d",elem,data[elem]);
    }
    cout << " -1";
    return 0;
}

标签:一千,结点,int,res,elem,链表,add,No.0089
From: https://blog.csdn.net/2301_76783671/article/details/139866332

相关文章

  • c语音实现单链表初始化的四种方式
    typedefstructmyLink{ intdata; structmyLink*next;}myLink,*myLLink;1、对于上面的简单结构,用函数赋值需要传递引用,需要用到指针的指针。对指针使用不是很清楚的童鞋很是头痛。voidinitlink(myLink**head){ *head=(myLink*)malloc(sizeof(myLink)); if(......
  • 链表插入的小技巧
    一个带有优先级的链表:structlist{structlist*next;u32priority;} 如果要按照优先级插入某个新节点node,算法一般会写成:intlist_insert(list**head,list*new){if(head==null||*head==null||new==null)return1;list*prev......
  • 算法题---判断链表中是否有环,并找出环的入口
    方案一、利用Set集合不会重复的原理booleanjudgeCycle(Nodehead){Set<Node>visited=newHashSet<>();Nodenode=head;while(node!=null){if(visited.contains(node))returntrue;visi......
  • 一千题,No.0086(开学寄语)
    下图是上海某校的新学期开学寄语:天将降大任于斯人也,必先删其微博,卸其QQ,封其电脑,夺其手机,收其ipad,断其wifi,使其百无聊赖,然后,净面、理发、整衣,然后思过、读书、锻炼、明智、开悟、精进。而后必成大器也!本题要求你写个程序帮助这所学校的老师检查所有学生的物品,以助其成大器......
  • 一千题,No.0087(多选题常见计分法)
    批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到50%分数;如果考生选择了任何一个错误的选项,则不能得分。本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多。输......
  • 链表相对于数组的优势,以及栈和队列的基本操作
    链表(LinkedList)和数组(Array)是两种常见的数据结构,它们各自在不同的场景下有其优势和劣势。链表相对于数组的优势主要体现在以下几个方面:动态大小:链表在插入和删除元素时,不需要像数组那样预先分配固定大小的内存空间。链表中的节点可以动态地分配和释放,这使得链表在处理动......
  • 【Python】python实现双向链表
    一、定义与结构双向链表(DoublyLinkedList)是一种链式数据结构,每个节点(Node)包含三个部分:一个数据域(data),一个指向前驱节点的指针(prev),以及一个指向后继节点的指针(next)。双向链表的每个节点都链接到前一个节点和后一个节点,从而允许在两个方向上进行遍历。双向链表的结构+---......
  • LeetCode 算法: 环形链表 c++
    原题链接......
  • C语言数据结构队列实现-链表队列
    简单实现了下链表队列代码如下#include<stdio.h>#include<stdlib.h>typedefstructNode{intdata;structNode*next;}Node;//入队列voidinsertList(Node*head,intelem){Node*temp=head;Node*newNode=(Node*)malloc(sizeof(Node));......
  • 链表中倒数最后k个结点
    本人学习的java,所以用java的代码来做,仅只给出基本的做题思路,代码优化方面本人能力不足暂不提供。根据描述,要求我们返回倒数第k个节点即可。我们可以用ArrayList集合解题: 在Java中,ArrayList是一个动态数组实现的类。它内部使用了一个数组来存储元素,但是它提供了一系列的方......