Go through the list to construct a pointer array of size (n-m+1) to keep the pointers from nth element to mth element. Then operate on this array to swap the elements symmetric to the center. For example, swap mth with nth, then (m+1)th with (n+1)th.

```
public ListNode reverseBetween(ListNode head, int m, int n) {
// back up head
ListNode headBak = head;
// get pointer array to point to all the elements betweent the mth and the nth elements
ListNode[] pointers = new ListNode[n-m+1];
int i = 0;
while (head != null){
i++;
if(i >= m){
pointers[i-m] = head;
}
if (i == n){
break;
}
head = head.next;
}
// between mth and nth element, swap start/end and move pointer towards center
int len = pointers.length;
for(int j = 0; j < len/2; j++){
int temp = pointers[j].val;
pointers[j].val = pointers[len-1-j].val;
pointers[len-1-j].val = temp;
}
return headBak;
}
```