【说明】:

  本文是左程云老师所著的《程序员面试代码指南》第二章中“按照左右半区的方式重新组合单链表”这一题目的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

按照左右半区的方式重新组合单链表相关推荐

  1. [编程题] 按照左右半区的方式重新组合单链表

    [编程题] 按照左右半区的方式重新组合单链表 给定一个单链表的头部节点head,链表长度为N. 如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区: 如果N为奇数,那么前N/2个节点 ...

  2. 链表问题20——按照左右半区的方式重新组合单链表

    题目 给定一个单链表的头部节点head,链表长度为N,如果N为偶数,那么前N/2个节点算作左半区,后N/2个节点算作右半区:如果N为奇数,那么前N/2个节点算作左半区,后N/2+1个节点算作右半区.左 ...

  3. 牛客网--按照左右半区的方式重新组合单链表

    题目描述 给定一个单链表的头部节点 head,链表长度为 N,如果 N 是偶数,那么前 N / 2 个节点算作左半区,后 N / 2 个节点算作右半区:如果 N 为奇数,那么前 N / 2 个节点算作 ...

  4. c语言递增20,2020-07-20(C语言)数据结构-在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素...

    //在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,例如:(7,10,10,21,30,42,42,51,70)将变为(7,10 ...

  5. 在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素。

    在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法,去掉数值相同的元素,使得表中不再有重复的元素.例如(7,10,10,21,30,42,42,42,51,70)将变为(7, ...

  6. 搞懂单链表常见面试题

    搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 <剑指 offer> ,有的来自<程序 ...

  7. 在单链表写入一组数据代码_链表常见操作和15道常见面试题

    什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...

  8. 数据结构一线性表 (顺序表、单链表、双链表)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...

  9. 单链表基本操作的实现

    单链表基本操作的实现 [PS]: 由于笔者的能力水平有限,如果遇到相关错误或者存在歧义的地方,欢迎在下方评论区留言联系笔者,如果你觉得这篇文章对你有帮助,那么不妨动动你的小手点赞收藏转发,让更多的人看 ...

最新文章

  1. C++11 开启多线程
  2. 進階查詢,讓查詢條件精確到底...
  3. 51Nod 1453 抽彩球
  4. 文巾解题 1833. 雪糕的最大数量
  5. 光纤收发器的AB端可随便连接吗?
  6. GitHub+jsDelivr+PicGo+Visual Studio Code 打造稳定、快速、高效、免费图床
  7. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...
  8. Python基础知识3: if判断语句
  9. 被问到TCP的可靠传输和提高网络利用率?
  10. network 宽带比特b,字节B
  11. 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?
  12. Ardunio开发实例-MAG3110磁传感器
  13. ISO-11270-车道保持辅助系统LKA性能测试方法和流程
  14. 令人敬畏的泰格伍兹 万维钢_5个令人敬畏的全新高级jQuery插件,2013年10月
  15. 达人评测 R7 PRO 6850HS 核显相当于什么显卡
  16. 圣天诺LDK - HL
  17. php最短路径tsp,最短路径tsp算法
  18. YII2 路由问题-摘自yii2官方文档
  19. 图像拼接(一):柱面投影+模板匹配+渐入渐出融合
  20. 那些改变过世界的代码都是怎么写的?

热门文章

  1. css3效果: animate实现点点点loading动画效果(一)
  2. Centos 6 克隆导致网卡eth0变成eth1、及修改网卡名的方法
  3. oracle数据库enq: TX - allocate ITL entry性能诊断
  4. Timestamp、String、Date之间的转换
  5. 2011 IBM IIS:聚百年智慧精髓 筑最优信息架构
  6. Kubernetes — Pod
  7. 移动通信网络频段大全,含5G、4G,各种公开频段汇总
  8. ARM处理器的运行模式和ARM寄存器
  9. django 基础知识 ~ forms详解
  10. docker之Dockerfile