给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
题目分析
. - 力扣(LeetCode)
代码:
/**
* 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:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode *pre = new ListNode(0,head); //伪头节点
ListNode * reversePre = pre;
int count = 1;
//找到反转区间头节点的上一个节点
while(count < left){
reversePre = reversePre -> next;
count++;
}
ListNode * reverseHead = reversePre -> next; //获取反转区间头节点
//反转区间
ListNode * last = nullptr;
ListNode * cur = reverseHead;
ListNode * next;
while(count<=right){
next = cur -> next;
cur -> next = last;
last = cur;
cur = next;
count++;
}
//重新拼接
reversePre->next = last;
reverseHead->next = cur;
return pre->next;
}
};