重排链表(算法时间复杂度O(NlogN))

news2024/10/7 13:23:34

给定一个单链表 L1​→L2​→⋯→Ln−1​→Ln​,请编写程序将链表重新排列为 Ln​→L1​→Ln−1​→L2​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

输入格式:

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

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

Address Data Next

其中Address是结点地址;Data是该结点保存的数据,为不超过105的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。

输出格式:

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

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <set>
using namespace std;

struct triple
{
    triple(string Address, int Data = 0, string Next = "0")
        :_Address(Address)
        ,_Data(Data)
        ,_Next(Next)
    {}
    
    triple()
    {}

    bool operator==(triple t)
    {
        if (t._Address == _Address)
        {
            return true;
        }
        else{
            return false;
        }
    }
    
    string _Address;
    int _Data;
    string _Next;
};

class MyComepare
{
public:
    bool operator()(triple t1, triple t2)
    {
        if (t1._Address > t2._Address)
        {
            return true;
        }
        else 
        {
            return false;
        }
    }
};

void fill_vector(vector<triple>& v, int num)
{    
    string Address;
    int Data = 0;
    string Next;
    while (num != 0)
    {
        cin >> Address;
        scanf("%d", &Data);
        cin >> Next;
        v.push_back(triple(Address, Data, Next));
        num--;
    }
}

void tidy_vector(vector<triple>& v, string& pfirst)
{
    if (pfirst == "-1")
    {
        return;
    }

    set<triple, MyComepare> s(v.begin(), v.end());
    int size = v.size();
    for (int i = 0; i < size; i++)
    {
        // 此方法时间复杂度为nlogn
        if (i == 0)
        {
            auto it = s.find(pfirst);
            v[i] = *it; 
        }
        else if (v[i-1]._Next == "-1")
        {
            v.resize(i);
            return;
        }
        else{
            auto it = s.find(v[i-1]._Next);
            v[i] = *it;
        }
        
        /*此方法时间复杂度为N的平方
        for (int j = i; j < size; j++)
        {
            if (i == 0)
            {
                if (v[j]._Address == pfirst)
                {
                    swap(v[j], v[0]);
                    break;
                }
            }
            else if (v[i-1]._Next == "-1")
            {
                v.resize(i);
                return;
            }
            else
            {
                if (v[j]._Address == v[i-1]._Next)
                {
                    swap(v[j], v[i]);
                    break;
                }
            }*/
        
    }
}

list<triple> resort_vector(vector<triple>& v)
{
    int size = v.size();
    auto end = v.end();
    auto begin = v.begin();
    auto half = begin;
    
    for (int i = 0; i < size/2; i++)
    {
        half++;
    }
    
    list<triple> ls(begin, half);
    auto cur = ls.begin();
    half--;
    end--;
    
    while (half != end)
    {
        ls.insert(cur, *end);
        end--;
        cur++;
    }
    
    auto next = ls.begin();
    cur = next++;
    while (cur != ls.end())
    {
        if (next == ls.end())
        {
            cur->_Next = "-1";
            cur++;
            break;
        }
        
        cur->_Next = next->_Address;
        cur++;
        next++;
    }
    
    return ls;
}

void print_list(list<triple>& ls)
{
    for (auto& e : ls)
    {
        cout << e._Address << ' ' << e._Data << ' ' << e._Next << endl;
    }
}

int main()
{
    vector<triple> v;
    string pfirst;
    int num = 0;
    cin >> pfirst;
    scanf("%d", &num);
    fill_vector(v, num);
    tidy_vector(v, pfirst);
    auto ls = resort_vector(v);
    print_list(ls);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-9-8 扩展欧几里得算法

题目链接&#xff1a;扩展欧几里得算法 #include <iostream> #include <algorithm>using namespace std;int exgcd(int a, int b, int &x, int &y) {if(!b){x 1, y 0;return a;}int d exgcd(b, a % b, y, x);y - a / b * x;return d; }int main() {int…

数据结构之栈的实现(附源码)

目录 一、栈的概念及结构 ​二、栈的实现 三、初学栈的练习题 一、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里&#xff0c;大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来&#xff0c;我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中&#xff0c;我们将分步…

【漏洞复现】一米OA存在任意文件读取漏洞

漏洞描述 一米OA协同办公系统,集成了OA办公自动化系统、手机客户端、专业报表工具,为全国千万企业用户提供全功能、性价比高的OA软件。 该OA系统的getfile.jsp文件存在任意文件上传漏洞,攻击者通过漏洞可以获取服务器的敏感信息。 免责声明 技术文章仅供参考,任何个人和…

浅谈高并发分布式架构演进路径

前言 一直很想写一篇能覆盖分布式方面的文章&#xff0c;但当写的时候发现分布式技术发展到现在阶段&#xff0c;有太多的最佳实践和方法论&#xff0c;网上的文章也特别多&#xff0c;根本无从下手。思来想去&#xff0c;发现很多最佳实践都是有一定的理论支撑&#xff0c;我…

图书管理系统 毕业设计

图书管理系统 毕业设计 摘 要 摘要&#xff1a;二十一世纪是信息的世纪&#xff0c;随着社会经济的发展&#xff0c;社会信息化程度也越来越高&#xff0c;学校作为教育与科技的先行者&#xff0c;优秀的技术往往会被所率先学校采用。优秀的学校管理决策者一定会毫不犹豫地选…

vue中获取农历时间

1.下载依赖 npm i chinese-lunar-calendar 2.局部使用 import { getLunar } from chinese-lunar-calendar; 3.使用 getLunar(new Date().getFullYear(), new Date().getMonth() 1, new Date().getDate()) 结果

【Java】高效利用异常处理技巧

文章目录 前言Java异常体系Error和ExceptionThrowable 常见的错误和异常编译时异常运行时异常Error 异常的处理捕获异常声明抛出异常类型 手动抛出异常对象&#xff1a;throw语法格式注意事项 自定义异常为什么需要自定义异常类 小结 前言 在使用计算机语言进行项目开发的过程…

C++ 学习之深拷贝 和 浅拷贝

前言 在C中&#xff0c;浅拷贝和深拷贝是涉及对象复制的两种不同方式&#xff0c;它们之间的关键区别在于拷贝对象时是否复制对象所指向的数据。 正文 浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝只复制对象本身&#xff0c;而不复制对象所指向的数据。…

redis(1)-hiredis-Windows下的编译

1.linux编译说明文档 GitHub - sewenew/redis-plus-plus: Redis client written in C 2.hiredis 编译 2.1 hiredis下载 https://github.com/redis/hiredis.git 2.2 hiredis cmake编译 2.2.1 配置生成:ConfigeGenerateOpen Project 配置源目录&#xff1a;…

【收藏】2023年成人高考题型分析、考试技巧

答题技巧 考试过程中&#xff0c;会做的题目按照自己的方法做&#xff0c;会做的务必一定要拿到分&#xff1b;不会做的&#xff0c;多得一分是一分。 1.字迹一定要工整&#xff0c;切勿潦草&#xff0c;减少涂改&#xff0c;尤其是语文&#xff0c;主观题和作文是没有标准答…

ubuntu下安装vscode代码编辑器

1、安装gcc&#xff08;安装前准备工作&#xff09; ubuntu下安装gcc报错&#xff1a; sudo apt get install gcc 正在等待缓存锁&#xff1a;无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 6809&#xff08;unattended-upgr&#xff09;持有 方式1&#xff1a;没有…

【漏洞库】Fastjson_1.2.47_rce

文章目录 漏洞描述漏洞编号漏洞评级影响版本漏洞复现- 利用工具- 漏洞环境- 漏洞扫描- 漏洞验证- 深度利用- GetShell- EXP 编写 漏洞挖掘- 寻找入口点- 指纹信息 修复建议- 漏洞修复 漏洞原理 漏洞描述 Fastjson是阿里巴巴公司开源的一款json解析器&#xff0c;其性能优越&am…

Python多进程爬取电影信息

观察翻页时详情页面url地址变化规律 import json from os import makedirs from os.path import exists import requests import logging import re from urllib.parse import urljoin import multiprocessing# 定义了下日志输出级别和输出格式 logging.basicConfig(levellog…

Java——》synchronized编译

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

python+selenium自动化测试项目实战

说明&#xff1a;本项目采用流程控制思想&#xff0c;未引用unittest&pytest等单元测试框架 一.项目介绍 目的 测试某官方网站登录功能模块可以正常使用 用例 1.输入格式正确的用户名和正确的密码&#xff0c;验证是否登录成功&#xff1b; 2.输入格式正确的用户名和不…

想做交传翻译,如何成为一名专业的交传译员?

据了解&#xff0c;交传翻译指的是在会议进行过程中&#xff0c;译员快速地记录演讲者发言内容&#xff0c;在主讲者发言间隙&#xff0c;将上一段演讲内容翻译成目标语言并演讲个观众听。那么&#xff0c;如何成为一名专业的交传译员&#xff1f; 交传译员必须具备的能力有哪…

阿里云ubuntu服务器搭建ftp服务器

阿里云ubuntu服务器搭建ftp服务器 服务器环境安装步骤一.创建用户二.安装 vsftp三 配置vsftp四.配置阿里云安全组 服务器环境 阿里云上的云服务器&#xff0c;操作系统为 ubuntu20.04。 安装步骤 一.创建用户 为什么需要创建用户&#xff1f; 这里的用户&#xff0c;指的是…

Spring MVC入门必读:实现增删改查

目录 引言 一、前期准备 1.1.搭建Maven环境 1.2.导入pom.xml依赖 1.3.导入配置文件 ①jdbc.properties ②generatorConfig.xml ③log4j2.xml ④spring-mybatis.xml ⑤spring-context.xml ⑥spring-mvc.xml ⑦修改web.xml文件 二、逆向生成增删改查 2.1.导入相关u…