博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode — reorder-list
阅读量:6475 次
发布时间:2019-06-23

本文共 3138 字,大约阅读时间需要 10 分钟。

/** * Source : https://oj.leetcode.com/problems/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 this in-place without altering the nodes' values. * * For example, * Given {1,2,3,4}, reorder it to {1,4,2,3}. */public class RecordList {    /**     * 将链表的后半部分翻转之后依次插入链表前半部分每个元素后面     *     * 设链表长度为n     * 1. 找到链表后半部分起始位置: n/2+1,使用双指针法,slow每次移动一个,fast每次移动两个,fast移动到最后的时候,slow指向的正好是 n/2+1     * 2. 反转后半部分连链表     * 3. 将反转后的后半部分链表依次插入前半部分,left指向左边,right指向反转后的第一个node,依次插入left的后一个,直到right指向null,     *      right每次移动一个node,left每次移动2个node(因为刚刚left后面插入一个节点)     *     * @param head     * @return     */    public LinkedNode record (LinkedNode head) {        if (head == null || head.next == null) {            return head;        }        LinkedNode midNode = findMidNode(head);        LinkedNode reversedList = reverse(midNode);        LinkedNode left = head;        LinkedNode right = reversedList;        while (right != null && right.next != null) {            // 记录将要被插入的元素            LinkedNode target = right;            // 下一个需要被插入的元素            right = right.next;            // 插入target到链表中            target.next = left.next;            left.next = target;            left = left.next.next;        }        return head;    }    private LinkedNode findMidNode (LinkedNode head) {        LinkedNode slow = head;        LinkedNode fast = head;        while (fast != null && fast.next != null) {            slow = slow.next;            fast = fast.next.next;        }        return slow;    }    private LinkedNode reverse (LinkedNode head) {        LinkedNode p = head;        LinkedNode pre = null;        while (p != null) {            LinkedNode next = p.next;            p.next = pre;            pre = p;            p = next;        }        return pre;    }    private class LinkedNode {        int value;        LinkedNode next;    }    /**     * 创建普通的链表     * @param arr     * @return     */    public LinkedNode createList (int[] arr) {        if (arr.length == 0) {            return null;        }        LinkedNode head = new LinkedNode();        head.value = arr[0];        LinkedNode pointer = head;        for (int i = 1; i < arr.length; i++) {            LinkedNode node = new LinkedNode();            node.value = arr[i];            pointer.next = node;            pointer = pointer.next;        }        return head;    }    private static void print (LinkedNode head) {        if (head == null) {            System.out.println("[]");        }        StringBuffer stringBuffer = new StringBuffer("[");        while (head != null) {            stringBuffer.append(head.value);            stringBuffer.append(",");            head = head.next;        }        stringBuffer.deleteCharAt(stringBuffer.length()-1);        stringBuffer.append("]");        System.out.println(stringBuffer);    }    public static void main(String[] args) {        RecordList recordList = new RecordList();        int[] arr = new int[]{1,2,3,4,5,6};        print(recordList.record(recordList.createList(arr)));    }}

转载于:https://www.cnblogs.com/sunshine-2015/p/7906585.html

你可能感兴趣的文章
第三十九天
查看>>
Redis详解
查看>>
论程序员加班的害处
查看>>
基于HTML5的WebGL设计汉诺塔3D游戏
查看>>
WPF资料链接
查看>>
再次更新
查看>>
利用Windows自带的Certutil查看文件MD5
查看>>
查询指定名称的文件
查看>>
开篇,博客的申请理由
查看>>
[JSOI2008]星球大战starwar BZOJ1015
查看>>
centos 7 部署LDAP服务
查看>>
iOS项目分层
查看>>
IntelliJ IDEA 注册码
查看>>
String字符串的截取
查看>>
DynamoDB Local for Desktop Development
查看>>
Shell编程-环境变量配置文件
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
<<The C Programming Language>>讀書筆記
查看>>
git代码冲突
查看>>