博客
关于我
#Leetcode# 92. Reverse Linked List II
阅读量:791 次
发布时间:2023-01-24

本文共 1887 字,大约阅读时间需要 6 分钟。

为了优化给定的链表反转代码,从位置m到n进行反转,可以使用双指针法高效地完成任务。以下是优化后的步骤解析:


步骤:

  • 确定反转的子链表范围

    • 找到从节点m开始到节点n结束的部分,即为需要反转的子链表。
  • 引入辅助指针

    • 使用slow_ptr从链表头开始,移动到节点m的位置。
    • 使用fast_ptr从节点n的位置开始,移动到链表末尾。
  • 移动慢指针到节点m

    • 逐步移动slow_ptr,直到它指向节点m的位置。
  • 调整快指针位置

    • fast_ptr从节点n开始,移动到链表末尾,确保它没有超出子链表的范围。
  • 反转子链表

    • slow_ptr到达节点m,保持fast_ptr在子链表末尾,逐步反转子链表。
    • 例如,将子链表从m到n反转为n到m。
  • 连接反转后的子链表

    • 断开链表中的节点,从m到n,插入反转后的子链表,使链表结构保持完整。
  • 处理剩余部分

    • 恢复前驱和后驱节点的指针,确保链表中的其他部分不受影响。

  • 以下是优化后的代码:

    class Solution {
    public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
    if (!head || m <= 0 || n >= m || n >= head->next) return head;
    int num = m - 1;
    dummy = new ListNode(-1);
    dummy->next = head;
    ListNode* slow = head;
    n -= m;
    while (m--) {
    slow = slow->next;
    }
    ListNode* cur = slow;
    while (n--) {
    cur = cur->next;
    }
    em *end = cur->next;
    cur->next = NULL;
    *slow_ptr = reverseList(slow);
    ptr fast = slow_ptr;
    while (fast->next) {
    fast = fast->next;
    }
    fast->next = end;
    while (num--) {
    st = st->next;
    }
    st->next = slow_ptr;
    return dummy->next->next;
    }
    ListNode* reverseList(ListNode* c) {
    if (!c || !c->next) return c;
    return reverseList(c->next);
    }
    static struct Node {
    int val;
    struct Node *next;
    explicit Node(int v) : val(v), next(nullptr) {}
    };
    }

    步骤说明:

  • 初始化辅助指针

    • 创建dummy节点作为起始点,便于处理边界问题。dummy->next = head确保链表的整体结构。
  • 移动slow_ptr到节点m

    • 使用循环,从链表头开始移动slow_ptr到节点m的位置。
  • 调整fast_ptr到节点n的位置

    • 使用另一个指针fast_ptr,从节点n开始移动到链表的末尾。然后,逐步内部反转子链表。
  • 反转子链表

    • 逐步反转子链表,从节点m到节点n,利用递归或内置函数reverseList完成。
  • 连结逆转后的子链表

    • 将反转后的子链表重新连接到原始链表中,确保整体结构的连贯性。
  • 恢复余下部分的指针

    • 逐步将dummy节点后的节点指向反转后的子链表,确保链表的路线正确。

  • 注意事项:

    • 确保从m到n的节点被正确反转,且链表其他部分不受影响。
    • 在链表长度较小时,需要特殊处理避免错误访问节点。

    通过以上步骤,可以在一次链表遍历中高效地实现反转操作,避免额外的空间复杂度,确保代码简洁且高效执行。

    转载地址:http://jleyk.baihongyu.com/

    你可能感兴趣的文章
    HTML 表单验证
    查看>>
    python解释器环境问题
    查看>>
    uni-app快速导入自己需要的插件
    查看>>
    编写xor_shellcode.py
    查看>>
    Echarts笔记
    查看>>
    Ubuntu 20.04 Docker 安装并配置
    查看>>
    在 eclipse 中将 web 项目部署到 tomcat 服务器上
    查看>>
    iOS关于申请公司开发者账号缴费支付
    查看>>
    Laravel 直接返回404页面
    查看>>
    常用元素操作的方法
    查看>>
    解决 matplotlib 中文显示乱码的问题
    查看>>
    解决打开 json 文件中文乱码的问题
    查看>>
    计算机网络基础:PKI(公钥基础设施)
    查看>>
    计算机网络基础:VLAN(虚拟局域网)
    查看>>
    计算机网络基础:文件共享服务器(注册表更改)
    查看>>
    计算机网络基础:用户和组管理
    查看>>
    基于Arduino的ESP32-S3 + OLED(4pin)的文字取模
    查看>>
    基于Arduino的ESP32-S3连接OneNET云平台实战指南(四)——ESP32-S3连接OneNET云平台的订阅主题与发布主题、消息(数据流)
    查看>>
    乒乓球问题
    查看>>
    Trae国内版发布,中国首款AI 原生IDE 正式上线,配置Doubao-1.5-pro,支持切换满血版DeepSeek 模型
    查看>>