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}
.
把找到的中位数的下一个结点及之后的链表逆序,然后插入到前面的链表中。
Source
/**
* 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, q = head;
while(q.next != null && q.next.next != null){ //遍历一遍找到中间结点的方法就是一个指针走 一步另一个走两步
p = p.next;
q = q.next.next;
}
q = p.next;
p.next = null; //***
ListNode ppre = null;
ListNode ppost; //ppre指向p的前一个结点 ppost指向p的下一个结点
while(q != null){ //链表逆置就是把链表指针顺序换个方向即可
ppost = q.next;
q.next = ppre;
ppre = q;
q = ppost;
}
q = ppre; //此时是最后一个结点是头结点
p = head;
ListNode temp1, temp2;
while(p != null && q != null){
temp1 = p.next;
temp2 = q.next;
q.next = temp1;
p.next = q;
p = temp1;
q = temp2;
}
}
}
Test
public static void main(String[] args){
ListNode a = new ListNode(1);
a.next = new ListNode(2);
a.next.next = new ListNode(3);
a.next.next.next = new ListNode(4);
a.next.next.next.next = new ListNode(5);
new Solution().reorderList(a);
while(a != null){
System.out.println(a.val);
a = a.next;
}
}