题目
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.
思路
用数组存储要倒置的节点的值,遍历一遍链表,然后将要倒置的存下来,然后使用之前记录的开始倒置的节点更替节点值。
代码
/**
* 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;
} else if (m <= 0) {
n = n + (1 - m);
m = 1;
}
int i = 1;
ListNode *index = head;
vector<int> subArray;
while (i < m) {
if (index->next == NULL) {
return head;
} else {
index = index->next;
i++;
}
}
ListNode *preIndex = index;
while (i <= n) {
if (index == NULL) {
break;
}
subArray.push_back(index->val);
index = index->next;
i++;
}
for (int j = subArray.size() - 1; j >= 0; j--) {
preIndex->val = subArray[j];
preIndex = preIndex->next;
}
return head;
}
};