Given a singly linked list LL 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…

You must do this in-place without altering the nodes' values.

For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.

反转以后的链表是,从左往右是,node0->noden->node1->nodenn-1->.....,首先想到是将链表L按照这个规律重新赋值一遍,但题中说不能改变结点的值;然后想到将链表反转然后重新连接起来,如1->2->3->4,

按虚线那样走,形成1->4->2->3->3->2->4->1,若是结点的值都不相同,则遇到相同时,就可以断开形成,若是有相同,可先统计结点的个数,然后判断终止条件。这样就需要新建一个链表。所以想到将链表一分为二,反转后半段,然后重新连接起来,依旧是1->2->3->4,

这样思路就出来了,分三步走,第一步,将链表一分为二,用到快慢指针;第二步,反转第二部分,反转链表是很重要的根基;第三步,将两链表接起来。参考了JustDoIt的博客。

使用快慢指针将链表分成两段,采用这种方式会导致在链表结点个数为奇数的情况下,后半段的个数比前半段多一个。前半段一preSlow维结束,后半段一slow开始。所以在第三步将两子链表连接起来的时候,要注意判断反转以后以newBeg开始的后半段是否已经结束,没有,则连接上剩余部分即可。

针对反转链表,要认真的理解,关键是反转以后,要在新的链表结尾加上next=NULL。

 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode *head)
{
if(head==NULL||head->next==NULL)
return;
//分成两段
ListNode *preSlow=NULL;
ListNode *slow=head,*fast=head;
while(fast&&fast->next)
{
preSlow=slow;
slow=slow->next;
fast=fast->next->next;
}
preSlow->next=NULL; //前半段 //反转后半段
ListNode *newBeg=slow;
ListNode *last=newBeg->next;
while(last)
{
ListNode *temp=last->next;
last->next=newBeg;
newBeg=last;
last=temp;
}
slow->next=NULL; //合并
fast=head;
preSlow=NULL;
while(fast) //注:以前半段为条件
{
ListNode *tem=newBeg->next;
newBeg->next=fast->next;
fast->next=newBeg;
fast=newBeg->next;
preSlow=newBeg;
newBeg=tem;
}
if(newBeg !=NULL) //因节点个数为奇数时,后段比前段多一个,所以最后要判断
preSlow->next=newBeg;
}
};

最新文章

  1. java中的switch case
  2. 《Linux及安全》实践3.1
  3. C#中的问号
  4. Google proto buffer的安装/使用
  5. unity工具IGamesTools之批量生成帧动画
  6. 最近工作用到的sql脚本
  7. iOS平常注意1
  8. phpcms v9后台登陆验证码无法显示,怎么取消验证码
  9. Unity3D中使用3DMAX建模规范
  10. cocos2d-x引擎实现$1Unistroke Recognizer手势识别
  11. Integer.parseInt()和valueOf()
  12. zMPLS的安装与配置
  13. SQL查询每个部门工资前三名的员工信息
  14. Jquery 清空input file的值
  15. bs4源码
  16. 关于新学期Python的一点见解
  17. 声明式调用---Feign
  18. 懒人小工具1:winform自动生成Model,Insert,Select,Delete以及导出Excel的方法
  19. Javaweb学习笔记——(六)——————xml中jaxp两种解析方式和dom4j运用
  20. Red Hat忘记root密码了怎么办?

热门文章

  1. windows和Ubuntu下安装mongodb
  2. QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ)
  3. Qt——菜单栏、工具栏、状态栏
  4. (数据科学学习手札03)Python与R在随机数生成上的异同
  5. WebService第一天——概述与入门操作
  6. Odoo8中安装新模块找不到的问题
  7. 配置ORACLE的PRO*C环境
  8. cadence17.2的OrCAD启动找不到license的问题
  9. valgrind检查still reachable情况
  10. vue2.0 watch