import java.util.*;
/**
* 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 ;
ListNode fast = head ;
ListNode slow = head ;//使用快慢指针,寻找分界点
while(fast.next != null && fast.next.next != null) {
fast = fast.next.next ;
slow = slow.next ;
}
ListNode rightPart = slow.next ;//分界点
slow.next = null ;//链表从分界点断开
rightPart = reverse(rightPart) ;//将右边部分翻转
ListNode l1 = head ;//左边部分的头结点
ListNode l2 = rightPart ;//右边部分的头结点
while(l1 != null && l2 != null) {//把右边部分的节点依次插入左边的节点之后
ListNode tmp = l2 ;
l2 = l2.next ;
tmp.next = l1.next ;
l1.next = tmp ;
l1 = l1.next.next ;
}
}
//翻转链表
public ListNode reverse(ListNode head) {
if(head == null) return head ;
ListNode pre = new ListNode(-1) ;//辅助节点
ListNode cur = head ;
ListNode nxt = null ;
while(cur != null) {
nxt = cur.next ;
cur.next = pre ;
pre = cur ;
cur = nxt ;
}
head.next = null ;//删除辅助节点
return pre ;
}
}