02-线性结构3 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 (≤10
​5
​​ ) 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次循环导致超时,没有采用格式化输出,用了很傻的方法。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <malloc.h>
using namespace std;
struct point
{int prev;int data;int next;
};
struct node{int addr;int data;struct node *next;
};struct node *Rverse(struct node *p,int k,int n){if(k==1) return p;else{struct node *temp,*b,*c,*d,*first;first=p;temp=p->next;b=temp->next;if(b->next){while(temp->next){int cnt=0;while(cnt<k && b->next){c=b->next;b->next=temp;temp=b;b=c;cnt++;}if(cnt+2<k){while(cnt>0){c=temp->next;temp->next=b;b=temp;temp=c;cnt--;}temp->next=b;first->next=temp;break;}else if(cnt==k){d=first->next;first->next=temp->next;first=d;first->next=temp;}else if(cnt+2==k){b->next=temp;temp=first->next;temp->next=0;first->next=b;break;}}}else{first->next=b;b->next=temp;}return p;}
}
void printAddr(int n){if(n>9999) cout<<n;else if(n>999) cout<<0<<n;else if(n>99) cout<<0<<0<<n;else if(n>9) cout<<0<<0<<0<<n;else cout<<0<<0<<0<<0<<n;
}int main()
{int firstAddr,n,k,i,exit=0;cin>>firstAddr>>n>>k;struct point oriList[n];for(i=0;i<n;i++){cin>>oriList[i].prev>>oriList[i].data>>oriList[i].next;}struct node *head,*p;head=(struct node *)malloc(sizeof(struct node));p=(struct node *)malloc(sizeof(struct node));head->next=p;p->addr=firstAddr;while(1){struct node *p1;p1=(struct node *)malloc(sizeof(struct node));for(int i=0;i<n;i++){if(oriList[i].prev==p->addr){p->data=oriList[i].data;if(oriList[i].next==-1){exit=1;break;}p1->addr=oriList[i].next;p->next=p1;p=p1;break;}}if(exit) break;}p->next=0;p=head;p=Rverse(p,k,n);while(1){p=p->next;printAddr(p->addr);cout<<' ';cout<<p->data<<' ';if(p->next){printAddr(p->next->addr);cout<<endl;}else{cout<<-1<<endl;break;}}return 0;
}

建立单链表的时候使用了二分查找和插值查找,还是超时。。代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include<algorithm>
#include<fstream>
#include <malloc.h>
using namespace std;
struct point
{int prev;int data;int next;
};
bool cmp(const point &a,const point &b)
{if(a.prev!=a.prev) return a.prev<b.prev;else return a.prev<b.prev;
}
typedef struct node{int addr;int data;struct node *next;
}node;node *Rverse(node *p,int k,int n){if(k==1) return p;else{node *temp,*b,*c,*d,*first;first=p;temp=p->next;b=temp->next;if(b->next){while(temp->next){int cnt=0;while(cnt<k && b->next){c=b->next;b->next=temp;temp=b;b=c;cnt++;}if(cnt+2<k){while(cnt>0){c=temp->next;temp->next=b;b=temp;temp=c;cnt--;}temp->next=b;first->next=temp;break;}else if(cnt==k){d=first->next;first->next=temp->next;first=d;first->next=temp;}else if(cnt+2==k){b->next=temp;temp=first->next;temp->next=0;first->next=b;break;}}}else{first->next=b;b->next=temp;}return p;}
}
void printAddr(int n){if(n>9999) cout<<n;else if(n>999) cout<<0<<n;else if(n>99) cout<<0<<0<<n;else if(n>9) cout<<0<<0<<0<<n;else cout<<0<<0<<0<<0<<n;
}int main()
{int firstAddr,n,k,i,exit=0;cin>>firstAddr>>n>>k;struct point oriList[n];for(i=0;i<n;i++){cin>>oriList[i].prev>>oriList[i].data>>oriList[i].next;}sort(oriList, oriList+n,cmp);struct node *head,*p;head=(node *)malloc(sizeof(node));p=(node *)malloc(sizeof(node));head->next=p;p->addr=firstAddr;while(1){int minb=0,maxb=n-1;struct node *p1;p1=(node *)malloc(sizeof(node));while(minb<=maxb){int mid;if(maxb-minb>50){mid=(p->addr-oriList[minb].prev)/(oriList[maxb].prev-oriList[minb].prev)*(maxb-minb);}else{mid=(minb+maxb)/2;}if(p->addr>oriList[mid].prev){minb=mid+1;}else if(p->addr<oriList[mid].prev){maxb=mid-1;}else{p->data=oriList[mid].data;if(oriList[mid].next==-1){exit=1;break;}p1->addr=oriList[mid].next;p->next=p1;p=p1;break;}}if(exit) break;}p->next=0;p=head;p=Rverse(p,k,n);while(1){p=p->next;printAddr(p->addr);cout<<' ';cout<<p->data<<' ';if(p->next){printAddr(p->next->addr);cout<<endl;}else{cout<<-1<<endl;break;}}return 0;
}

借鉴大神的代码如下:

#include<stdio.h>
#define MAX_SIZE 100004typedef struct tagLNode{int addr;      //节点位置Addressint data;      //Data值int nextAddr;  //下个节点位置struct tagLNode *next;  //指向下个节点的指针
} LNode;
/*LNode *listReverse(LNode *head, int k);  反转单链表函数参数1:单链表的头节点,参数2:反转子链表的长度,返回值:反转后的链表的第一个节点(不是头结点)*/
LNode *listReverse(LNode *head, int k);
//输出单链表 参数为单链表的头结点
void printList(LNode *a);int main()
{int firstAddr;int n = 0;            //节点数 Nint k = 0;            //反转子链表的长度Kint num = 0;          //链表建好之后的链表节点数int data[MAX_SIZE];   //存data值 节点位置作为索引值int next[MAX_SIZE];   //存next值 节点位置为索引int tmp;              //临时变量,输入的时候用scanf("%d %d %d", &firstAddr, &n, &k);    LNode a[n+1];                //能存n+1个几点的数组。a[0].nextAddr = firstAddr;   //a[0] 作为头节点//读输入的节点int i = 1;    for (; i < n+1; i++){scanf("%d", &tmp);scanf("%d %d", &data[tmp], &next[tmp]);        }//构建单链表i = 1;while (1){if (a[i-1].nextAddr == -1){a[i-1].next = NULL;num = i-1;break;            }a[i].addr = a[i-1].nextAddr;a[i].data = data[a[i].addr]; a[i].nextAddr = next[a[i].addr];a[i-1].next = a+i;i++;}LNode *p = a;                    //p指向链表头结点LNode *rp = NULL;                //反转链表函数的返回值if (k <= num ){for (i = 0; i < (num/k); i++){rp = listReverse(p, k);  //p->next = rp;            // 第一次执行,a[0]->next 指向第一段子链表反转的第一个节点p->nextAddr = rp->addr;  // 更改Next值,指向逆转后它的下一个节点的位置int j = 0;//使p指向下一段需要反转的子链表的头结点(第一个节点的前一个节点)while (j < k){p = p->next;j++;}}}printList(a);
}LNode *listReverse(LNode *head, int k)
{int count = 1;LNode *new = head->next;LNode *old = new->next;LNode *tmp = NULL;while (count < k){tmp = old->next;old->next = new;old->nextAddr = new->addr;new = old;   //new向后走一个节点old = tmp;   //tmp向后走一个节点count++;}//使反转后的最后一个节点指向下一段子链表的第一个节点head->next->next = old;  if (old != NULL){//修改Next值,使它指向下一个节点的位置head->next->nextAddr = old->addr; }else{//如果old为NULL,即没有下一个子链表,那么反转后的最后一个节点即是真个链表的最后一个节点head->next->nextAddr = -1;       }return new;
}void printList(LNode *a)
{LNode *p = a;while (p->next != NULL){p = p->next;        if (p->nextAddr != -1 ){//格式输出,%.5意味着如果一个整数不足5位,输出时前面补0 如:22,输出:00022printf("%.5d %d %.5d\n", p->addr, p->data, p->nextAddr);}else{//-1不需要以%.5格式输出printf("%.5d %d %d\n", p->addr, p->data, p->nextAddr);}    }}

转载于:https://www.cnblogs.com/JingwangLi/p/10202835.html

02-线性结构3 Reversing Linked List相关推荐

  1. [PAT] 02-线性结构2 Reversing Linked List(单向链表的逆转) - C语言实现

    今天突然想起自己的cnblog有差不多一年没更了?放一道很久前做的也写好了很久但是一直忘记发布的题.如果有不同的算法欢迎分享~ [PAT]02-线性结构2 Reversing Linked List  ...

  2. PTA 02-线性结构3 Reversing Linked List 题目解析

    PTA-mooc完整题目解析及AC代码库:PTA(拼题A)-浙江大学中国大学mooc数据结构全AC代码与题目解析(C语言) Given a constant K and a singly linked ...

  3. 02-线性结构3 Reversing Linked List (25 分)

    如果 单纯从做题角度来讲,上一个做法当然没问题,可是目的是为了练习静态链表,so还是不要投机取巧了,静态链表解法如下: #include <stdio.h> struct data {in ...

  4. 【数据结构笔记14】微软面试经典 - 逆转链表问题(Reversing Linked List)

    本次笔记内容: 线性结构习题.1 什么是抽象链表 线性结构习题.2 链表逆转算法 线性结构习题.3 测试数据 文章目录 (抽象链表)没有指针的语言,可以表达链表么? Reversing Linked ...

  5. 栈和队列都是限制存取点的线性结构_栈的练习以及解析

    The Practice Of Stack栈的练习01 栈是(). A.顺序存储的线性结构     B.链式存储的非线性结构 C.限制存取点的线性结构     D.限制存储点的非线性结 答案:B 解析 ...

  6. 头歌实践教学平台数据结构与算法:02线性表

    针对数据结构02线性表在头歌平台练习过程中的完成代码,关卡数目较多,每题思路单独在每一关中解释.如有其他需求请留言. 第一关 可以把问题转换为:遍历B中的元素,如果该元素不在A中,则把该元素插入到A中 ...

  7. 数据结构单向链表线性结构_线性数据结构链表为何以及如何解释

    数据结构单向链表线性结构 Imagine you have gone to a crowded place, say to a k-pop concert with your friends and ...

  8. java数据结构之线性结构和非线性结构

    数据结构包括 :线性结构和非线性结构. 线性结构 1):线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系. 2):线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序 ...

  9. 数据结构与算法——线性结构——线性表及其表示

    -"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...

最新文章

  1. 嵌入式学习笔记之XMODEM
  2. 荣发护肤护甲增强配方 Hair, Skin and Nails Plus 100 tablets
  3. php 安装curl init,linux下为php添加curl扩展的方法及curl_init函数用法案例详解
  4. 大型高并发高负载网站的系统架构(转)
  5. MySQL HINT:Straight_JOIN
  6. Activity与Thread之间的通讯(old)
  7. Hi3516A开发--烧写/启动模式
  8. 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
  9. 在kubernetes集群中运行nginx
  10. 宏观经济学思维导图_2019中央财经大学803经济学经验分享|三跨考生
  11. 产品经理学习---好产品需要用户有感知
  12. 利用ClustrMaps | GoStats | 51la | Google Analytics统计和分析访问量
  13. HDFS API操作的访问方式及JUnit测试类的使用
  14. 2进制 , 8进制 , 10进制 , 16进制 , 介绍 及 相互转换 及 快速转换的方法
  15. java前端vml_在Web中使用JavaScript和VML实现WebGIS中的测距
  16. 易基因|ChIP-seq等实验揭示CHD6转录激活前列腺癌通路的关键功能 | 肿瘤耐药研究
  17. st8s003 c语言编译器,什么原因导致ST单片机STM8S003F3P6这个8位机缺货
  18. 解决微信浏览器video标签自动播放视频失效
  19. ofbiz实战8——实验室预约管理系统功能介绍
  20. 读取服务器光模块信息,如何使用MIB读取光模块的收发光功率

热门文章

  1. 烦人,周报要不要取消?| 每日趣闻
  2. Cesium学习笔记(九):导入3D模型(obj转gltf)
  3. Linux中的 awk查找日志中的相关记录
  4. BZOJ-1192-[HNOI2006]鬼谷子的钱袋
  5. 51nod 最大M子段和系列
  6. CS0016: 未能写入输出文件的解决方法
  7. 关于crontab命令的学习
  8. Spring3 MVC 注解---注解基本配置及@controller和 @RequestMapping 常用解释
  9. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)
  10. HDU 2149 Public Sale (博弈)