按照左右半区的方式重新组合单链表
【说明】:
本文是左程云老师所著的《程序员面试代码指南》第二章中“按照左右半区的方式重新组合单链表”这一题目的C++复现。
本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。
感谢左程云老师的支持。
【题目】:
给定一个单链表的头节点 head,链表长度为 N,如果 N 为偶数那么前 N/2 个节点算作左半区,后 N/2 个节点算作右半区;如果 N 为奇数,那么前 N/2 个节点算作左半区,后 N/2+1 个节点算作右半区。左半区从左到右依次记为 L1->L2->...,右半区从左到右依次记为 R1->R2->...,请将链表调整为 L1->R1->L2->R2->...的形式。
例如:
1->NULL,调整为1->NULL
1->2->NULL,调整为1->2->NULL
1->2->3->NULL,调整为1->2->3NULL
1->2->3->4->NULL,调整为1->3->2->4NULL
1->2->3->4->5->NULL,调整为1->3->2->4->5->NULL
1->2->3->4->5->6->NULL,调整为1->4->2->5->3->6->NULL
【思路】:
解法:正确的确定中间位置。
【编译环境】:
CentOS6.7(x86_64)
gcc 4.4.7
【实现】:
实现及测试代码:
1 /* 2 *文件名:list_relocate.cpp 3 *作者: 4 *摘要:按照左右半区的方式重新组合单链表 5 */ 6 7 #include <iostream> 8 9 using namespace std; 10 11 class Node 12 { 13 public: 14 Node(int data) 15 { 16 value = data; 17 next = NULL; 18 } 19 public: 20 int value; 21 Node *next; 22 }; 23 24 void mergeLR(Node *left,Node *right) 25 { 26 Node *next = NULL; 27 while(NULL != left->next) //将right插入到left中 28 { 29 next = right->next; 30 right->next = left->next; 31 left->next = right; 32 left = right->next; 33 right = next; 34 } 35 left->next = right; 36 } 37 38 void relocate(Node *head) 39 { 40 if(NULL == head || NULL == head->next) 41 return ; 42 Node *mid = head; 43 Node *right = head->next; 44 while(NULL != right->next && NULL != right->next->next) //确定中心 45 { 46 mid = mid->next; 47 right = right->next->next; 48 } 49 right = mid->next; 50 mid->next = NULL; 51 mergeLR(head,right); 52 } 53 54 void printList(Node *head) 55 { 56 while(NULL != head) 57 { 58 cout << head->value << " "; 59 head = head->next; 60 } 61 cout << endl; 62 } 63 64 int main() 65 { 66 Node *head(NULL),*ptr(NULL); 67 for(int i =1;i<10;i++)//构造链表 68 { 69 if(NULL == head) 70 { 71 head = new Node(i); 72 ptr = head; 73 continue; 74 } 75 ptr->next = new Node(i); 76 ptr = ptr->next; 77 } 78 cout << "Before being relocated:" << endl; 79 printList(head); 80 cout << "After being relocated:" << endl; 81 relocate(head); 82 printList(head); 83 return 0; 84 }
View Code
注:
转载请注明出处;
转载请注明源思路来自于左程云老师的《程序员代码面试指南》。
转载于:https://www.cnblogs.com/PrimeLife/p/5453779.html
按照左右半区的方式重新组合单链表相关推荐
- [编程题] 按照左右半区的方式重新组合单链表
[编程题] 按照左右半区的方式重新组合单链表 给定一个单链表的头部节点head,链表长度为N. 如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区: 如果N为奇数,那么前N/2个节点 ...
- 链表问题20——按照左右半区的方式重新组合单链表
题目 给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区:如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区.左 ...
- 牛客网--按照左右半区的方式重新组合单链表
题目描述 给定一个单链表的头部节点 head,链表长度为 N,如果 N 是偶数,那么前 N / 2 个节点算作左半区,后 N / 2 个节点算作右半区:如果 N 为奇数,那么前 N / 2 个节点算作 ...
- c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...
//在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...
- 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。
在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...
- 搞懂单链表常见面试题
搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 <剑指 offer> ,有的来自<程序 ...
- 在单链表写入一组数据代码_链表常见操作和15道常见面试题
什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...
- 数据结构一线性表 (顺序表、单链表、双链表)
版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...
- 单链表基本操作的实现
单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...
最新文章
- C++11 开启多线程
- 進階查詢,讓查詢條件精確到底...
- 51Nod 1453 抽彩球
- 文巾解题 1833. 雪糕的最大数量
- 光纤收发器的AB端可随便连接吗?
- GitHub+jsDelivr+PicGo+Visual Studio Code 打造稳定、快速、高效、免费图床
- service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...
- Python基础知识3: if判断语句
- 被问到TCP的可靠传输和提高网络利用率?
- network 宽带比特b,字节B
- 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?
- Ardunio开发实例-MAG3110磁传感器
- ISO-11270-车道保持辅助系统LKA性能测试方法和流程
- 令人敬畏的泰格伍兹 万维钢_5个令人敬畏的全新高级jQuery插件,2013年10月
- 达人评测 R7 PRO 6850HS 核显相当于什么显卡
- 圣天诺LDK - HL
- php最短路径tsp,最短路径tsp算法
- YII2 路由问题-摘自yii2官方文档
- 图像拼接(一):柱面投影+模板匹配+渐入渐出融合
- 那些改变过世界的代码都是怎么写的?