zoukankan      html  css  js  c++  java
  • 重排链表

    给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
    将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
    示例 1:
    给定链表 1->2->3->4, 重新排列为 1->4->2->3.
    示例 2:
    给定链表 1->2->3->4->5, 重新排列为 1->5->2->4,

    思路:1.利用快慢指针找到中间结点,将链表分为前后链表

    2.逆转中间结点后面的

    3.将逆转后的链表插入前面的链表

    代码如下:

    public void reorderList(ListNode head) {
            if(head == null || head.next == null) return;
            //找到中间结点
            ListNode fast = head;
            ListNode slow = head;
            while(fast!=null&&fast.next!=null) {
                fast = fast.next.next;
                slow = slow.next;
            }
            //标记slow下一个结点,并让slow.next == null
            ListNode tmp = slow.next;
            slow.next = null;
            //逆转slow结点后面的结点
            ListNode s = reverse(tmp);
            ListNode f = head;
            //将逆序后的每一个结点进行插入
            while(s!=null) {
                ListNode cur = s.next;
                s.next = f.next;
                f.next = s;
                f = s.next;
                s = cur;
            }
  • 相关阅读:
    Linux LAMP架构搭建
    Linux 系统版本查询
    Linux 安装本地 yum源
    Linux 虚拟机安装vmware tools
    随记分页码
    flexigrid 修改json格式
    Asp.Net MVC及Web API框架配置会碰到的几个问题及解决方案
    web api 文档声明
    android UI
    Sending HTML Form Data
  • 原文地址:https://www.cnblogs.com/du001011/p/10646519.html
Copyright © 2011-2022 走看看