• PAT Advanced 1074 Reversing Linked List (25) [链表]


    题目

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.
    Input Specification:
    Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by
    -1.Then N lines follow, each describes a node in the format:

    Address Data Next

    where Address is the position of the node, Data is an integer, and Next is the position of the next node.
    Output Specification:
    For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
    Sample Input:
    00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218
    Sample Output:
    00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1

    题目分析

    已知N个结点,以K为步长,反转链表

    解题思路

    1. 定义结点,使用数组存储N个结点,使用order属性记录链表中结点出现序号
    2. 将链表分为n/k个段,对每个段进行反转
      2.1 每个节点的next即为反转后的下一个结点地址
      2.2 每个段最后一个节点的特殊处理:next为下一个段反转前最后一个结点
      2.3 最后一个段的处理
      • 若n%k==0,说明n可以正好分为n/k个段,最后一个段反转,并将最后一个节点置为-1
      • 若n%k!=0,说明最后一段小于k,开始下标为n/k*k,不需要反转,顺序打印,并将最后一个结点置为-1

    知识点

    1. 将n个结点分为n/k个段,最后一段开始下标为n/k*k(下标从0开始)
    2. 链表反转,不一定非要对链表进行反转(即:更换每个结点next值),可以使用本题思想反向打印的办法

    Code

    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int maxn=100010;
    struct node {
    	int adr;
    	int data;
    	int next;
    	bool flag=false;//初始化为false
    	int order=maxn;
    } nds[maxn];
    bool cmp(node &n1,node &n2) {
    	return n1.order<n2.order;
    }
    int main(int argc,char *argv[]) {
    	int hadr,n,k,adr;
    	scanf("%d %d %d",&hadr,&n,&k);
    	for(int i=0; i<n; i++) {
    		scanf("%d",&adr);
    		scanf("%d %d",&nds[adr].data,&nds[adr].next);
    		nds[adr].adr=adr;
    	}
    	int count=0;
    	for(int i=hadr; i!=-1; i=nds[i].next) {
    //		nds[i].flag=true;
    		nds[i].order=count++;
    	}
    	sort(nds,nds+maxn,cmp);
    	n=count;
    //	for(int i=0; i<n; i++) {
    //		printf("%05d %05d %05d
    ",nds[i].adr,nds[i].data,nds[i].next);
    //	}
    	for(int i=0; i<n/k; i++) {
    		for(int j=(i+1)*k-1; j>i*k; j--) {
    			printf("%05d %d %05d
    ",nds[j].adr,nds[j].data,nds[j-1].adr);
    		}
    		printf("%05d %d",nds[i*k].adr,nds[i*k].data);
    		if(i<n/k-1) {
    			printf(" %05d
    ",nds[(i+2)*k-1].adr);
    		} else {
    			if(n%k==0)printf(" -1
    "); //正好可以分为n/k块,并且打印最后一块
    			else {
    				printf(" %05d
    ",nds[(i+1)*k].adr);
    				for(int j=n/k*k; j<n; j++) {
    					printf("%05d %d",nds[j].adr,nds[j].data);
    					if(j<n-1)printf(" %05d
    ",nds[j+1].adr);
    					else printf(" -1
    ");
    				}
    			}
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    常用设计模式
    文件上传相关报错: The current request is not a multipart request或is a MultipartResolver configured?
    Intellij IDEA 与 Gitlab 实现代码上传与下载
    Oracle两表关联,只取B表的第一条记录
    notepad++ 调整行间距
    Ubuntu18.04直接安装python3.7或者升级自带的python3.6版本之后导致终端无法打开的解决办法
    黑苹果之DELL台式机安装Mac OS X 10.13.6版本操作系统
    Windows Ping | Tracert 's Bat 脚本并行测试
    centos 7 修改 sshd | 禁止 root 登录及 sshd 端口脚本定义
    C语言中malloc函数的理解
  • 原文地址:https://www.cnblogs.com/houzm/p/12296790.html
Copyright © 2020-2023  润新知