You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
You may not modify the values in the list's nodes. Only nodes themselves may be changed.
Input: head = [1,2,3,4]
Output: [1,4,2,3]
Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]
public void reorderList(ListNode head) {
if(head==null ||head.next==null){
return;
}
ListNode mid=middleNode(head);
ListNode right=reverse(mid.next);
mid.next=null; //caution
merge(head,right);
}
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 merge(ListNode head1,ListNode head2){
int index=0;
ListNode dummy=new ListNode(0);
while(head1!=null && head2!=null){
if(index%2==0){
dummy.next=head1;
head1=head1.next;
}
else{
dummy.next=head2;
head2=head2.next;
}
dummy=dummy.next;
index++;
}
if(head1!=null){
dummy.next=head1;
}
if(head2!=null){
dummy.next=head2;
}
}
public ListNode middleNode(ListNode head) {
ListNode slow=head;
ListNode fast=head.next;
while(fast!=null && fast.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}