当前位置: 首页 > news >正文

PAT 1025 反转链表

题目

/*
 1025. 反转链表 (25)
 
 给定一个常数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(<= 10^5)、以及正整数K(<=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
 */

思路

// 关键信息
/*
 input:
 地址A 结点数N 间隔K
 地址 内容 next
 
 限制:
 地址A:5位数
 结点数N:<= 10^5
 
 */

// 思路:构建链表,放入顺序表,通过变换顺序表得到所需的序列
// 将单链表每隔 K 个反转,最后不足数的不反转

代码

#include <cstdio>
#include <vector>
#include <iostream>
#include <string.h>
#include <algorithm>

using namespace std;

struct Node{
    int addr;
    int a;
    int next;
};

int main(){
    
//  读入
    
    // 第一行
    int root;
    int n;
    int k;
    cin >> root >> n >> k;
    
    // 其余行
    vector<Node> inLst;
    int posOf[100005];
    int cnt = 0;
    
    inLst.clear();
    memset(posOf, -1, sizeof(posOf));
    for (int i = 0; i < n; ++i) {
        Node node;
        cin >> node.addr >> node.a >> node.next;
        
        inLst.push_back(node);
        posOf[node.addr] = cnt++;
    }
    
//  遍历
    vector<Node> linkLst;
    linkLst.clear();
    
    int p = root;
    int i;
    for (i = 0; i < n; ++i) {
        Node node = inLst[posOf[p]];
        linkLst.push_back(node);
        
        p = node.next;
        
        if (p == -1) {
            break;
        }
    }
    
//  变换
    int time = (int)linkLst.size() / k;
    for (int i = 0; i < time; ++i) {
        reverse(linkLst.begin() + i * k, linkLst.begin() + (i + 1) * k);
    }
//  输出
    int size = (int)linkLst.size();
    for (int i = 0; i < size; ++i){
        if (i == size - 1) {
            printf("%05d %d -1\n",linkLst[i].addr,linkLst[i].a);
        }else{
            printf("%05d %d %05d\n",linkLst[i].addr,linkLst[i].a,linkLst[i+1].addr);
        }
    }
    return 0;
}

过程资料

编码列表
1、三个测试点没过: http://paste.ubuntu.com/9844549/
2、过多的边界情况:逻辑上问题,设计得过于复杂,处理子串K的时候与前后杂糅在一起,导致一系列错误:http://paste.ubuntu.com/9847027/
3、AC,通过多个临时变量减轻子串K与前后的杂糅,依旧不推荐这种,过于复杂易错:http://paste.ubuntu.com/9847572/
4、AC,离散化方法寻址,再将链表结点按序存储为顺序表,十分方便:http://paste.ubuntu.com/9849986/


注意点:

  1. 在处理链表时,要特别注意在结点改变前保存指针信息。很容易出现使用了改动之后的结点指针而出错。
  2. 遍历链表的时候每次都针对某个结点操作,尽量不改变前后结点的值。

转载于:https://www.cnblogs.com/tangyikejun/p/4300382.html

相关文章:

  • Android -- 滑式抽屉SlidingDrawer(非原创)
  • 前端不为人知的一面--前端冷知识集锦
  • javascript组件——轮播图
  • hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)
  • eclipse经常卡死
  • 使用视图(带索引)
  • 三边测量法:通过三点坐标和到三点的距离,返回第4点位置
  • PHP大神的十大优良习惯
  • 谈一谈二叉搜索树中序迭代器的关键设计
  • POJ 1984
  • Ubuntu 配置开机启动到字符界面
  • 【监控】天机镜——优土大数据平台应用级别监控利器
  • Webpack - CommonJs AMD 模块打包器
  • 浅谈Swift语法
  • 开通博客园
  • “大数据应用场景”之隔壁老王(连载四)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 「面试题」如何实现一个圣杯布局?
  • Hibernate【inverse和cascade属性】知识要点
  • JS题目及答案整理
  • LeetCode算法系列_0891_子序列宽度之和
  • mysql innodb 索引使用指南
  • Object.assign方法不能实现深复制
  • WebSocket使用
  • 闭包--闭包之tab栏切换(四)
  • 深度学习在携程攻略社区的应用
  • 说说动画卡顿的解决方案
  • 项目实战-Api的解决方案
  • Spring第一个helloWorld
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #、%和$符号在OGNL表达式中经常出现
  • #mysql 8.0 踩坑日记
  • #前后端分离# 头条发布系统
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (一)Java算法:二分查找
  • (转) Face-Resources
  • (转)创业家杂志:UCWEB天使第一步
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .aanva
  • .apk 成为历史!
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8.0 发布到 IIS
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net 流——流的类型体系简单介绍
  • .net6 webapi log4net完整配置使用流程
  • .net分布式压力测试工具(Beetle.DT)
  • @Not - Empty-Null-Blank