链表区间反转
c++代码
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode* res = new ListNode(-1); // 创建一个新的节点作为结果链表的虚拟头节点
res -> next = head; // 将虚拟头节点的下一个节点指向原链表的头节点
ListNode* pre = res; // 创建指向前一个节点的指针 pre,初始为虚拟头节点
ListNode* cur = head; // 创建指向当前节点的指针 cur,初始为原链表的头节点
// 移动 pre 和 cur 指针,使得 cur 指向第 m 个节点,pre 指向第 m-1 个节点
for(int i = 1; i < m; i++) {
pre = cur;
cur = cur->next;
}
// 反转从第 m 个节点到第 n 个节点的链表段
for(int i = m; i < n; i++) {
ListNode* temp = cur->next; // 创建临时指针 temp,指向 cur 的下一个节点
cur->next = temp->next; // 断开 cur 和 temp 之间的链接
temp->next = pre->next; // 将 temp 插入到 pre 的下一个节点位置
pre->next = temp; // 将 temp 设置为 pre 的下一个节点,完成插入操作
}
return res->next; // 返回结果链表的头节点
}
};
图解
图解说明
- 每次循环,将cur后面的节点的移到pre后面
- 总计循环n-m次(因为2个节点交换一次,n-m+1个节点交换n-m次)