### not hard

add a head before head, and walk m step and then reverse n-m+1 element. After that connect the reset list.Watch out! m<=n .

`````` 1 /**
2  * Definition for singly-linked list.
3  * struct ListNode {
4  *     int val;
5  *     ListNode *next;
6  *     ListNode(int x) : val(x), next(NULL) {}
7  * };
8  */
9 class Solution {
10 public:
11     ListNode *reverseBetween(ListNode *head, int m, int n) {
12         if ( !head || n == m ) {
14         }
15         ListNode* h = new ListNode(-1);
17         ListNode* p = h;
18         int t = 1;
19         while ( t < m ) {
20             t++;
21             p = p->next;
22         }
23         ListNode* q = p->next;
24         p->next = NULL;
25         ListNode* qnext = NULL;
26         ListNode* r = NULL;
27         while ( t <= n ) {
28             qnext = q->next;
29             q->next = p->next;
30             if ( NULL == r ) {
31                 r = q;
32             }
33             p->next = q;
34             q = qnext;
35             t++;
36         }
37         r->next = q;