题目链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/
题目描述
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
思路
同题206 反转链表。
(1)首先遍历链表到第m个,同时存下第m-1个节点指针con
(2)对m~n节点进行反转
(3)将反转后的部分与前一部分,以及后一部分进行相连
注意:
对con为空的情况进行处理
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
代码
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(!head || !head->next || m >= n) return head;
ListNode *pNode = head;
ListNode *pPrev = nullptr;
int i = 1;
while(pNode!= nullptr && i <m){
pPrev = pNode;
pNode = pNode->next;
i++;
}
ListNode *con = pPrev; // 前半部分末尾节点
ListNode *tail = pNode; // 待翻转的第一个节点,也是翻转后的最后一个节点
// 中间部分翻转
while (pNode != nullptr && i <= n){
ListNode *pNext = pNode->next;
pNode->next = pPrev;
pPrev = pNode;
pNode = pNext;
i++;
}
if(con)
con->next = pPrev;
else
head = pPrev; // pPrev是翻转后的第一个节点
tail->next = pNode; // 翻转部分的最后一个节点和下一个节点相接
return head;
}
};