反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
一、思路
使用双指针加向量的方法,向量存放链表的值,指针一快一慢,两者相差n-m,等到快的那个到达第n个节点时,慢的到了第m个节点,开始赋值
C++代码:
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode *p1 = head, *p2 = head;
int len = n - m;
vector<int> nums;
for (int i = 1; i <= n; i++) {
nums.push_back(p1->val);
p1 = p1->next;
if (i > len + 1)
p2 = p2->next;
}
int j = nums.size() - 1;
for (int i = 0; i <= len; i++) {
p2->val = nums[j--];
p2 = p2->next;
}
return head;
}
};
执行效率: