Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL./**
* Definition of singly-linked-list:
*
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param head: ListNode head is the head of the linked list
* @param m: An integer
* @param n: An integer
* @return: The head of the reversed ListNode
*/
// Dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
// | | | |
// head preM mNode postN
// |
// nNode
//
// ---------------V
// Dummy -> 1 2 <- 3 <- 4 5 -> NULL
// | | |
// preM mNode postN
// |
// nNode
// ---------------^
ListNode * reverseBetween(ListNode * head, int m, int n) {
if (head == NULL || m > n) {
return head;
}
ListNode *dummy = new ListNode(0);
dummy->next = head;
head = dummy;
for (int i = 1; i < m; i++) {
if (head == NULL) {
return NULL;
}
head = head->next;
}
ListNode *mNode = head->next;
ListNode *nNode = mNode;
ListNode *postN = mNode->next;
for (int i = 0; i < n - m; i++) {
ListNode *temp = postN->next;
postN->next = nNode;
nNode = postN;
postN = temp;
}
mNode->next = postN;
head->next = nNode;
return dummy->next;
}
};