B1025. 反转链表 (25) A1074

给定一个常数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(<= 105)、以及正整数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
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <iostream>
 4 #include <string.h>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <string>
 8 #include <stack>
 9 #include <queue>
10 using namespace std;
11 const int maxn=100010;
12 struct Node{
13     int data;
14     int address;
15     int next;
16     int order;
17 }node[maxn];
18
19 bool cmp(Node a,Node b)
20 {
21     if(a.order==-1||b.order==-1)
22     return a.order>b.order;
23     else{
24         return a.order<b.order;
25     }
26 }
27
28 int main(){
29     for(int i=0;i<maxn;i++)
30     {
31         node[i].order=-1;//顺序都为负
32     }
33     int begin,n,k,address;
34     scanf("%d %d %d",&begin,&n,&k);
35     for(int i=0;i<n;i++)
36     {
37         scanf("%d",&address);
38         scanf("%d %d",&node[address].data,&node[address].next);
39         node[address].address=address;
40     }
41
42     int p=begin,count=0;
43     while(p!=-1)//遍历得有效节点
44     {
45         node[p].order=count++;
46         p=node[p].next;
47     }
48     sort(node,node+maxn,cmp);
49     //
50     n=count;
51     //单链表排序完毕 开始输出
52     for(int i=0;i<n/k;i++)
53     {
54         //最后一块不一定完整
55         //逆向输出
56          for(int j=(i+1)*k-1;j>i*k;j--)
57          {
58              printf("%05d %d %05d\n",node[j].address,node[j].data,node[j-1].address);
59          }
60          //每块最后一个点
61          printf("%05d %d ",node[i*k].address,node[i*k].data) ;
62          if(i<n/k-1)
63          {
64              printf("%05d\n",node[i*k+2*k-1].address);
65          }else
66          {
67              if(n%k==0)printf("-1\n");
68              else
69              {
70                  printf("%05d\n",node[(i+1)*k].address);
71                  //多余节点按序输出
72                 for(int j=(i+1)*k;j<n;j++)
73                 {
74                     printf("%05d %d ",node[j].address,node[j].data) ;
75                     if(j==n-1)printf("-1\n");
76                     else
77                     printf("%05d\n",node[j+1].address);
78                 }
79
80              }
81          }
82     }
83     return 0;
84 }
时间: 2024-10-27 17:46:36

B1025. 反转链表 (25) A1074的相关文章

PAT-乙级-1025. 反转链表 (25)

1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数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(<= 105)

PAT 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(<= 105).以及正整数K(<=N),即要求反转的子链结点的个数.结点的地址是5位非负整数,NULL地址用-1表示. 接下来有N行,每行格式为: Address Data Ne

PAT1025. 反转链表 (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(<= 105).以及正整数K(<=N),即要求反转的子链结点的个数.结点的地址是5位非负整数,NULL地址用-1表示. 接下来有N行,每行格式为: Address Data Ne

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 (≤105).以及正整数 K (≤N),即要求反转的子链结点的个数.结点的地址是 5 位非负整数,

【C/C++】反转链表

/* * reverseList.c * * Created on: 2014年6月25日 * Author: wenbo */ #include <iostream> using namespace std; struct Node { Node* next; int data; }; void trace(Node* node) { Node* tmp = node; while (tmp != NULL) { cout << tmp->data << &qu

反转链表——剑指offer

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 代码: 1 #include<stdio.h> 2 #include"malloc.h" 3 typedef struct node 4 { 5 struct node *next; 6 int data; 7 }*ListNode; 8 9 //尾插法创建链表(不带头结点) 10 ListNode creatrList() 11 { 12 ListNode p = (ListNode)mall

【剑指offer】十,反转链表

题目描述 输入一个链表,反转链表后,输出链表的所有元素. 分析:此题学过数据结构的应该会首先想到链表建立时所采用的头插法,即每一个新插入进来的点均插在链表头.代码如下: 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode R

九度oj题目1518:反转链表

题目1518:反转链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2567 解决:948 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数.输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素. 输出: 对应每个测试案例,以此输出链表反转后的元素,如没有元素则输

【链表】反转链表

输入一个链表,反转链表后,输出链表的所有元素. 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode ReverseList(ListNode head) { 12 13 if (null == head || null ==