`

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

    AJAX拖动列表排序示例

    2. 创建ReorderList控件:在ASP.NET页面上声明ReorderList,设置必要的属性,如TargetControlID(指定数据绑定的目标控件)和DragDropBehaviour(定义拖放行为)。 3. 数据绑定:将列表数据源绑定到ReorderList,...

    经典编程题1

    代码中定义了一个`Solution`类,其中`findMiddle`方法用于寻找链表的中间节点,`reverse_list`方法用于反转链表,`reorderList`则是主方法,完成链表的重排操作。`reorderList`中先检查链表长度,对于长度小于等于3...

    重排链表1

    在提供的 `Solution` 类中,`reorderList` 函数实现了以上步骤。首先检查链表是否为空,然后执行上述三个步骤。这个函数的时间复杂度是 O(n),因为我们需要遍历链表两次,一次找到中间节点,一次进行合并;空间...

    python-leetcode面试题解之第143题重排链表-题解.zip

    def reorderList(head): if not head or not head.next: return head mid = find_mid(head) next_to_mid = mid.next mid.next = None right = reverse_list(next_to_mid) left = head right_tail = None ...

    python-leetcode题解之143-Reorder-List

    python python_leetcode题解之143_Reorder_List

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

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

    python 教程 leetcode 代码模板-.Linked-List-Two-Pointers-List.md

    def reorderList(self, head: ListNode) -&gt; None: if not head or not head.next: return # 找到链表中点 mid = self.findMid(head) # 反转后半部分链表 l2 = mid.next mid.next = None l2 = self....

    js-leetcode题解之143-reorder-list.js

    javascript js_leetcode题解之143-reorder-list.js

    完全手册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实用开发详解 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等,...

    Leetcode题目+解析+思路+答案.pdf

    - **Reorder List**:按照特定规则重新排列链表。 - **Partition List**:将链表按值分割成两个部分。 - **Add Two Numbers**:两个非负整数相加,结果存储在链表中。 - **Copy List with Random Pointer**:...

Global site tag (gtag.js) - Google Analytics