`

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}.

给定一个链表让我们重新排列它,例如以前的顺序为0-1-2-3-4,排列后的顺序为0-4-1-3-2。我们首先要找到中间的节点,用快慢指针,这个比较简单,不过值得注意的是节点是奇数和偶数的不同情况。找到中间节点后我们可以借助堆栈将后半部分的节点压栈,然后从头结点开始一个一个的处理,可以解决。堆栈实际上帮我们将链表的后半段反转了,如果我们不借助堆栈也可以解决,我们可以将链表从中间节点分为两段,将后半段反转,然后再将两个链表合为一个链表,这样就不需要借助堆栈,时间复杂度为O(n), 空间复杂度为O(1)。下面是两种方法的代码:
1,Using stack
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        if(head == null) return;
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
       
        if(fast != null){
            slow = slow.next;
        }
        while(slow != null) {
            stack.push(slow);
            slow = slow.next;
        }
        while(!stack.isEmpty()){
            ListNode top = stack.pop();
            ListNode temp = head.next;
            head.next = top;
            top.next = temp;
            head = temp;
            
        }
        head.next = null;
    }
}


2,Without stack
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void reorderList(ListNode head) {
        if(head == null || head.next == null) return;
        ListNode fast = head;
        ListNode slow = head;
        ListNode pre = null;
        //get the middle node, and cut list into two sublists
        while(fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        ListNode midNode = slow.next;
        slow.next = null;
        
        // reverse the latter part
        ListNode newNode = reverseLatterPart(midNode);
        
        //merge two sublists
        while(newNode != null) {
            ListNode tem = head.next;
            head.next = newNode;
            head = newNode;
            newNode = tem;
        }
        
    }
    private ListNode reverseLatterPart(ListNode head) {
        ListNode prev = null;
        ListNode tem = null;
        while(head != null) {
            tem = head.next;
            head.next = prev;
            prev = head;
            head = tem;
        }
        return prev;
    }
    
}
0
0
分享到:
评论

相关推荐

    AjaxControlToolkit之ReorderList

    介绍了Ajax控件-ReorderList的使用方法:添加数据,修改数据,删除数据,以及拖动排序。除了修改数据有部分代码,其他功能皆无代码(ReorderList的界面拖动排序也无需代码),都是一次性绑定数据源控件。~~还在为网络...

    AJAXControlToolKit的ReorderList

    ASP.NET AJAX的ReorderList控件是可以实现无排序数据绑定的列表控件,从名字上就可以看出来因为它是Reorder的,也就是说能够通过和服务器端交互数据重新排序绑定的数据项。要实现重排序,用户只需简单的拖动某条记录的...

    Reorder List/Library Columns-crx插件

    语言:English (United States) 重新排序列表/库列 它是针对SharePoint用户和开发人员的工具。 该工具将有助于对列表或库列进行重新排序。 首先,登录到SharePoint...https://github.com/dipongkor/reorder-rolumns.git

    完全手册:ASP.net Ajax电子教程

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    完全手册ASP.NET AJAX实用开发详解 源码

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    完全手册:ASP.net.Ajax

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    完全手册ASP、NET AJAX实用开发详解光盘

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    cpp-算法精粹

    Reorder List LRU Cache Palindrome Linked List 字符串 Valid Palindrome Implement strStr() String to Integer (atoi) Add Binary Longest Palindromic Substring Regular Expression Matching Wildcard Matching...

    完全手册:ASP.NET AJAX实用开发详解 part3

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    asp.net+ajax

    利用ReorderList控件实现拖拽排序;利用Rating控件实现评分功能;利用Accordion控件实现QQ样式的菜单。 第6章 注册登录。 第8章 留言本。 第9章 分页模块。 第10章 文件上传显示进度条功能。 第11章 相册模块。 第12...

    完全手册:ASP.net Ajax电子教程-part1

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    完全手册:ASP.net Ajax电子教程-part2

    首先介绍了ASP.NET AJAX基础知识和结构,然后介绍了ASP.NET AJAX Control Toolkit中的全部控件,如AutoComplete、PasswordStrength、CollapsiblePanel、Tabs、CascadingDropDown、ReorderList、SlideShow等,...

    基于Java实现reorder-list(链表重排序)【100012113】

    Given a singly linked list$ L: L_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...

    asp.net 使用控件

    31 ReorderList 任意添加列表内容并更改列表顺序 32 ResizableControlExtender 控件大小改变 33 RoundedCornersExtender 圆角大小 34 SliderExtender 类似音量大小那种拖动条空间 SlideShowExtender 幻灯片一张...

    LeetCode最全代码

    * [Linked List](https://github.com/kamyu104/LeetCode#linked-list) * [Stack](https://github.com/kamyu104/LeetCode#stack) * [Queue](https://github.com/kamyu104/LeetCode#queue) * [Heap]...

    Ajax完全自学手册(PPT)

    第1章 Ajax简介以及使用的场合 第2章 浏览器中的JavaScript ... 第3章 XMLHttpRequest对象 3.1.3 最简单的Ajax示例 ...Calender ReorderList控件的使用 RatingExample Rating控件的属性或方法

    Ajax完全自学手册(源代码).rar

    Calender ReorderList控件的使用 RatingExample Rating控件的属性或方法 第15章(\C06) MyLogin ASP.NET Ajax注册登录 第16章(\C07) AddressList Ajax通讯录 第17章(\C08) LinkageList 级联...

    Ajax完全自学手册PPT和源代码(ptt格式)

    Calender ReorderList控件的使用 RatingExample Rating控件的属性或方法 第15章(\C06) MyLogin ASP.NET Ajax注册登录 第16章(\C07) AddressList Ajax通讯录 第17章(\C08) LinkageList 级联菜单(使用VS ...

    ASP.net Ajax Control Toolkit控件应用

    ASP.net Ajax Control Toolkit控件应用: 包括:利用AutoCompleteExtender控件实现自动完成的功能;...利用ReorderList控件实现拖拽排序;利用Rating控件实现评分功能;利用Accordion控件实现QQ样式的菜单。

    drag-drop-reorder-list:拖放列表

    这是我面试的一家公司的实实在在的项目。版本1.3变化: 新增了将问题添加到类别的功能新增了从类别中删除问题的功能类别现在显示标题中的问题数量版本1.2 版本1.1 版本1.0 yarn start 在开发模式下运行应用程序。...

Global site tag (gtag.js) - Google Analytics