棧和隊列----按照左右半區的方式重新組合單鏈表
阿新 • • 發佈:2018-08-02
利用 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; } }
棧和隊列----按照左右半區的方式重新組合單鏈表