Reverse a linked list from position m to n. Do it in-place and in one-pass.code
Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ length of list.
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode *pre = NULL, *ptr = head; ListNode *res = NULL; ListNode *cur = NULL, *tail = NULL; ListNode *tmp = NULL; int k = 1; while(k < m){ pre = ptr; if(res == NULL) res = pre; ptr = ptr->next; k++; } while(k <= n){ tmp = ptr->next; if(cur == NULL){ cur = ptr; tail = ptr; } else{ ptr->next = cur; cur = ptr; } ptr = tmp; k++; } if(res == NULL){ res = cur; } else pre->next = cur; tail->next = ptr; return res; } };