Reorder List
Description
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 alerting the nodes’ values.
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The head of linked list.
* @return: nothing
*/
public void reorderList(ListNode head) {
// write your code here
if(head == null|| head.next == null ){
return ;
}
ListNode mid = findMid(head) ;
ListNode head2 = reverse(mid.next) ;
mid.next = null ;
reorder(head , head2) ;
// return curt ;
}
public ListNode findMid(ListNode head){
ListNode fast = head , slow = head ;
while(fast != null && fast.next != null){
fast = fast.next.next ;
slow = slow.next ;
}
return slow ;
}
public ListNode reverse(ListNode head ){
ListNode prev = null ;
while(head != null){
ListNode temp = head.next ;
head.next = prev ;
prev = head ;
head = temp ;
}
return prev ;
}
public void reorder(ListNode head1 , ListNode head2){
ListNode dummy = new ListNode(0) ;
ListNode tail = dummy ;
int i = 0 ;
while(head1 != null && head2 != null ){
if(i % 2 == 0){
tail.next = head1 ;
head1 = head1.next ;
}else{
tail.next = head2 ;
head2 = head2.next ;
}
tail = tail.next ;
i++ ;
}
if(head1 != null){
tail.next = head1 ;
}else{
tail.next = head2 ;
}
//return dummy.next ;
}
}