将midnode后面的node的指针反转,再从头尾两边同时遍历
注意midnode的next设为null
1 public class Solution { 2 public void reorderList(ListNode head) { 3 // IMPORTANT: Please reset any member data you declared, as 4 // the same Solution instance will be reused for each test case. 5 int count = 0; 6 ListNode midnode = head; 7 ListNode runner = head; 8 while(runner != null&&runner.next!=null) 9 { 10 runner = runner.next.next; 11 midnode = midnode.next; 12 count++; 13 } 14 if(count < 1||midnode.next == null) 15 return; 16 17 ListNode fastrunner = midnode.next; 18 runner = midnode; 19 while(fastrunner!=null) 20 { 21 ListNode tmp = fastrunner.next; 22 fastrunner.next = runner; 23 runner = fastrunner; 24 fastrunner = tmp; 25 } 26 ListNode frontrunner = head; 27 ListNode backrunner = runner; 28 while(frontrunner!=midnode && backrunner!=midnode) 29 { 30 ListNode tmp = backrunner.next; 31 backrunner.next = frontrunner.next; 32 frontrunner.next = backrunner; 33 frontrunner = frontrunner.next.next; 34 backrunner = tmp; 35 } 36 midnode.next = null; 37 } 38 39 }