1. 程式人生 > >棧和隊列----按照左右半區的方式重新組合單鏈表

棧和隊列----按照左右半區的方式重新組合單鏈表

利用 imp size 左右 依次 移動 return strong ||

按照左右半區的方式重新組合單鏈表

  

  給定一個單鏈表的頭部節點 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; } }

棧和隊列----按照左右半區的方式重新組合單鏈表