Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
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.
#include<string>
#include <vector>
using namespace std;
// Definition for a binary tree node.
//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) {
if (m == n)
{
return head;
}
int iReverse = n - m+1 ;
ListNode *resNode = new ListNode(0);
resNode->next = head;
ListNode* curNode = resNode;
while (--m)
{
curNode = curNode->next;
}
ListNode* m1Node = curNode;//(m-1)位置的节点指针
ListNode* mNode = curNode->next;//m节点的指针
curNode = mNode->next;//(m+1)节点的指针
int te = 0;
ListNode* temp = mNode;
while (--iReverse)
{
ListNode* nextNode = curNode->next;
curNode->next = temp;
temp = curNode;
curNode = nextNode;
}
m1Node->next = temp;
mNode->next = curNode;
return resNode->next;
}
};