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 altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public void reorderList(ListNode head) {
if(head==null || head.next==null) return;
ListNode p = head;
ListNode q = head;
while(q.next!=null && q.next.next!=null) {
p = p.next;
q = q.next.next;
}
// reverse the second part of list.
ListNode cur = p.next;
p.next = null;
p = null;
ListNode nxt = null;
while(cur!=null) {
nxt = cur.next;
cur.next = p;
p = cur;
cur = nxt;
}
ListNode head2 = p;
p = head;
q = head2;
while(q!=null ) {
ListNode pn = p.next;
ListNode qn = q.next;
p.next = q;
q.next = pn;
q = qn;
p = pn;
}
}
}