1、题目
给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
链接:https://leetcode-cn.com/problems/reverse-linked-list-ii
2、思路分析
1)穿针引线
找到开始的位置和结束的位置,将开始的前一个位置标记起来,结束的位置的下一个位置标记起来,将 start 和 end 之间的链表反转,写一个函数。
反转函数是将end和start连接起来,然后一个一个的在start前面插入。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
pair<ListNode*, ListNode*> reverse(ListNode* start, ListNode* end)
{
end->next = start;
ListNode* back = start;
ListNode* cur = start->next;
while(cur != end){
ListNode* t = cur;
cur = cur->next;
t->next = back;
end->next = t;
back = t;
}
return {end, start};
}
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* p = new ListNode(0);
p->next = head;
ListNode* start = p;
for(int i = 0; i < left - 1; ++i){
start = start->next;
}
ListNode* l1 = start;
start = start->next;
ListNode* end = p;
for(int i = 0; i < right; ++i){
end = end->next;
}
ListNode* l2 = end->next;
tie(start, end) = reverse(start, end);
l1->next = start;
end->next = l2;
return p->next;
}
};