Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-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}.

分析:

本题可以参考reverse Linked List II的做法。
这个题,依次从最后将元素放到前面,比如1,2,3,4,5,6,将6插入到1后面,再将5插入到2后面,再将4插入到3后面。但是因为链表无法从后往前遍历,所以想办法4,5,6三个数从前往后遍历插入到前面,也就是说,先将4,5,6变成6,5,4,即1,2,3,6,5,4,这样就可以从3开始,将3后面元素依次插入到前面,也就是从前往后遍历了。将后面一半元素逆序(4,5,6->6,5,4),也就是reverse linked list II的做法,依次将4后面的元素插入到3后面。
这个题还涉及到求中间的元素,也就是这里的3,因为3后面的元素(后半部分)要逆序,这里使用两个指针,一个走两步,一个走一步,走到最后慢指针就是中间元素了(要开始逆序之前的那个元素)。
综上:1,求出中间元素;2、将中间元素后面的元素逆序(旋转);3、将旋转后的后半部分依次插入到前面相应位置。

求出中间元素时,对于偶数个元素,可能中间元素取前面那个3,也可能取后面那个4。这里取前面那个3,判断准则见代码。

具体细节见代码:

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if(head==null||head.next==null) return ;
ListNode fast=head;
ListNode slow=head;
//1、找链表的中间元素,如1,2,3,4,5,6,找到3.1,2,3,4,5也是找到3.slow指向中间元素3
while(fast.next!=null&&fast.next.next!=null){//如果是找到1,2,3,4,5,6中的4,只要fast.next!=null
fast=fast.next.next;
slow=slow.next;
} //2、将中间元素后面的元素选旋转,1,2,3,4,5,6->1,2,3,6,5,4.将4后面所有元素依次插入到3后面
ListNode mid=slow;
ListNode start=slow.next;
ListNode then=start.next;//需要往前插入的元素
while(then!=null){
//先断开then节点
start.next=then.next;
then.next=mid.next;
mid.next=then;
then=start.next;
} //3、将后半部分元素依次插入到前面
fast=head;
slow=mid.next;
while(fast!=mid){ //中点时就不用动了,因为最后一个已经在中点后面了,在中点时还要做操作就会出现空指针异常
mid.next=slow.next;//断开slow
slow.next=fast.next;
fast.next=slow;
fast=fast.next.next;
slow=mid.next; } }
}

reorder list(链表重新排序)的更多相关文章

  1. [LeetCode] Reorder List 链表重排序

    Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...

  2. python经典面试算法题1.4:如何对链表进行重新排序

    本题目摘自<Python程序员面试算法宝典>,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中. 1.4 对链表按照如下要求重新排序 [微软笔试题] 难度系数: ...

  3. 【Leetcode】143. Reorder List

    Question: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You ...

  4. LeetCode(109):有序链表转换二叉搜索树

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

  5. L2-022 重排链表(链表)

    题目: 给定一个单链表 L​1​​→L​2​​→⋯→L​n−1​​→L​n​​,请编写程序将链表重新排列为 L​n​​→L​1​​→L​n−1​​→L​2​​→⋯.例如:给定L为1→2→3→4→5→6 ...

  6. 天梯赛 L2-022. (数组模拟链表) 重排链表

    题目链接 题目描述 给定一个单链表 L1→L2→...→Ln-1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln-1→L2→....例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2 ...

  7. 手动实现一个虚拟DOM算法

    发现一个好文:<深度剖析:如何实现一个 Virtual DOM 算法> 源码 文章写得非常详细,仔细看了一遍代码,加了一些注释.其实还有有一些地方看的不是很懂(毕竟我菜qaq 先码 有时间 ...

  8. A1133. Splitting A Linked List

    Given a singly linked list, you are supposed to rearrange its elements so that all the negative valu ...

  9. 告知你不为人知的UDP-连接性和负载均衡

    版权声明:本文由黄日成原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/812444001486438028 来源:腾云阁 h ...

随机推荐

  1. 修改Chrome默认的搜索引擎

    Chrome浏览器可谓是现在世界上最受欢迎的一款浏览器了,不仅仅是在其简单易用还有优雅的界面,还有与一众以人为本的设计理念,在我的眼里,匠心独具.但是咧,由于在国内谷歌是被禁止访问的,所以Chrome ...

  2. 操作系统处理内存时内存页为4k

    windows和unix处理内存时,一个内存页的大小都为4k. 测试代码 int main() { while (1) { int *p = (int *)malloc(1024); getchar( ...

  3. Xcode中Groups和Folder的区别

    以前一直没有在意这个问题,今天"中奖"了 ;( 在Xcode文件夹视图中会发现2种颜色的文件夹图标:黄色和蓝色. 黄色表示组(groups),蓝色表示文件夹(folder). 组只 ...

  4. Activity绑定自定义视图

    在安卓工程中,我们通过创建可以自动生成on_Create方法,这里面有个: setContentView(R.layout.activity_main);是系统自带的一个布局文件,但是在开发的过程中, ...

  5. Android官方命令深入分析之绘制9-patch

    9-patch是一个所见即所得的编辑器,允许你创建可以自动更改大小适应屏幕的bitmap图像.被选中的部分可以水平或垂直的进行缩放. 下面是使用9-patch工具创建一个9-patch图像的实例,首先 ...

  6. Html标签中thead、tbody、tfoot的作用

    Html标签中thead.tbody.tfoot的作用 为了让大表格(table)在下载的时候可以分段的显示,就是说在浏览器解析HTML时,table是作为一个整体解释的,使用TBODY可以优化显示. ...

  7. Spring - IOC简介

    DI(Dependence Injection)依赖注入: userService依赖于容器注入的 这样拿的 这个过程由容器来控制,这个称为依赖注入. IOC(Inverse of control)控 ...

  8. python的str()和repr()的区别

    str()一般是将数值转成字符串. repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思.如list,dict使用str()是无效的,但使用repr可以,这是为了看 ...

  9. Leetcode_118_Pascal's Triangle

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41827325 Given numRows, generat ...

  10. Android事件总线分发库EventBus3.0的简单讲解与实践

    Android事件总线分发库EventBus的简单讲解与实践 导语,EventBus大家应该不陌生,EventBus是一款针对Android优化的发布/订阅事件总线.主要功能是替代Intent,Han ...