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){
return;
}
if(head.next == null || head.next.next == null){//有两个以上的节点翻转才有意义
return;
}
ListNode p1 = head;
ListNode p2 = head;
while(p2.next != null && p2.next.next != null){
p1 = p1.next;
p2 = p2.next.next;
}
//p1的位置就是中间位置
ListNode second = new ListNode(-1);
ListNode p = p1.next;
p1.next = null;
while(p != null){
ListNode q = p.next;
p.next = second.next;
second.next = p;
p = q;
}
p1 = head;
//奇数时前半条链多一个元素,偶数时前后链元素个数相同
second = second.next;//second有一个头元素,这个节点不存储任何信息,只是来标志是头结点,这样操作方便
while(second != null){
p2 = p1.next;
p1.next = second;
second = second.next;
p1.next.next = p2;
p1 = p2;
}
}
}
Runtime: 500 ms