题目
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.
题意
翻转指定区间的元素,尽管和Reverse Linked List类似,但是还是有本质上区别。
注意
m和n超过链表范围怎么办
m>n怎么办
思路
1.首先建立虚拟头结点的链表
2.找到区间[m,n]的前一个元素m-1
3.在区间内做反转操作。cur指向的区间内的第一个元素,反转cur->next元素。
4.最终的实现效果,不断向pre后插入cur后的元素,直到cur移动到区间末尾。
代码
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
//虚拟头结点
ListNode *new_head = new ListNode(0);
new_head->next = head;
ListNode *pre = new_head;
//1.找到区间内的前一个元素
for(int i=0;i<m-1;i++)
{
pre = pre->next;
}
//2.获取区间内的第一个元素
ListNode *cur = pre->next;
//3.在区间内做反转操作
for(int i=0;i<n-m;i++)
{
ListNode *move = cur->next;
cur->next = move->next;
move->next = pre->next;
pre->next = move;
}
//return head;
return new_head->next;
}
};