public class ReorderListMe {
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode n2 = new ListNode(2);
ListNode n3 = new ListNode(3);
ListNode n4 = new ListNode(4);
ListNode n5 = new ListNode(5);
ListNode n6 = new ListNode(6);
head.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
ReorderListMe reorderListMe = new ReorderListMe();
reorderListMe.reorderList(head);
while(null != head){
System.out.print(head.val + " ");
head = head.next;
}
}
public void reorderList(ListNode head) {
// 从中间位置反转链表的节点
if(null == head){
return;
}
// 1 2 3 4 5 6
ListNode slow = head; // 每次走一步
ListNode fast = head; // 每次走两步
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
/*
开始逆序 , 将链表从中间部分断开,后半部分逆序
1 2 3
6 5 4
*/
ListNode newHead = new ListNode(-1);
ListNode temp = slow.next;
slow.next = null;
slow = temp;
while(slow != null){
temp = slow.next;
slow.next = newHead.next;
newHead.next = slow;
slow = temp;
}
/*
* 合并两个链表
*/
newHead = newHead.next;
ListNode p = head;
while(p != null && null !=newHead){
temp = p.next;
p.next = newHead;
p = temp;
temp = newHead.next;
newHead.next = p;
newHead = temp;
}
}
}
class ListNode {
int val;
ListNode next = null;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
}