zoukankan      html  css  js  c++  java
  • 栈和队列----按照左右半区的方式重新组合单链表

    按照左右半区的方式重新组合单链表

      

      给定一个单链表的头部节点 head,链表长度为 N ,如果 N 为偶数,那么前 N/2 算作前半区,后 N/2 算作后半区,如果 N 为奇数,那么前 N/2 算作前半区,后 N/2 + 1算作后半区。左半区从左到右依次记为 L1->L2->...,右半区从左到右依次记为 R1->R2->...,将该链表调整为 L1->R1->L2->R2->...的形式。

      【解题思路】

      1. 链表为空或者长度为1 ,则不需要进行任何调整

      2. 利用一个快指针和一个慢指针,找到右侧的起始点,将其断开,分成两个链表

      3. 然后两个链表按照约定的顺序进行重新组合

    package com.test;
    
    import com.test.ListNode;
    
    /**
     * Created by Demrystv.
     */
    public class ReformByLeftAndRight {
    
        public void reform(ListNode head){
            if (head == null || head.next == null){
                return;
            }
    
            ListNode mid = head;
            ListNode right = head.next;
            while (right.next != null || right.next.next != null){
                mid = mid.next;
                right = right.next.next;
            }
    
            right = mid.next;
            mid.next = null;
            merge(head, right);
        }
    
        public void merge(ListNode left, ListNode right){
            ListNode next = null;
            while (left.next != null){
                next = right.next;
    
                //先让right接上left后面的部分,然后再让left去接right
                right.next = left.next;
                left.next = right;
    
                //指针的移动
                left = right.next;
                right = next;
            }
            left.next = right;
        }
    
    }
  • 相关阅读:
    「Luogu2397」 yyy loves Maths VI (mode)
    「Luogu2014」 选课
    「Luogu2972」 [USACO10HOL]岩石和树木Rocks and Trees
    中国剩余定理
    点双连通分量
    Miller_Rabin大质数检验
    manachaer算法
    Kruskal重构树
    世界,你好!
    [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥
  • 原文地址:https://www.cnblogs.com/Demrystv/p/9404617.html
Copyright © 2011-2022 走看看