【 链表区间反转图解】

链表区间反转

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次)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值