博客
关于我
#Leetcode# 92. Reverse Linked List II
阅读量:790 次
发布时间: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/

    你可能感兴趣的文章
    ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案
    查看>>
    ElasticSearch - 分布式搜索引擎底层实现——倒排索引
    查看>>
    ElasticSearch - 在 微服务项目 中基于 RabbitMQ 实现 ES 和 MySQL 数据异步同步(考点)
    查看>>
    ElasticSearch - 基于 docker 部署 es、kibana,配置中文分词器、扩展词词典、停用词词典
    查看>>
    ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合
    查看>>
    ElasticSearch - 基于 JavaRestClient 操作索引库和文档
    查看>>
    ElasticSearch - 基于 JavaRestClient 查询文档(match、精确、复合查询,以及排序、分页、高亮)
    查看>>
    ElasticSearch - 基于 “黑马旅游” 案例,实现搜索框、分页、条件过滤、附近酒店、广告置顶功能
    查看>>
    20241012更新_yum install 找不到合适的yum源_yum源不起作用_yum无法安装程序_Linux默认源替换---Linux工作笔记067
    查看>>
    ElasticSearch - 基础概念,以及和 mysql 的对比
    查看>>
    ElasticSearch - 索引库和文档相关命令操作
    查看>>
    elasticsearch 7.7.0 单节点配置x-pack
    查看>>
    ElasticSearch 中 REST API 详解
    查看>>
    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制)
    查看>>
    Hot100之回溯算法
    查看>>
    Elasticsearch 时区问题
    查看>>
    Elasticsearch 索引字段类型为text,添加keyword类型操作
    查看>>
    Elasticsearch(四) es出现的问题:填坑
    查看>>
    elasticsearch-5.1.1 安装的问题
    查看>>
    Elasticsearch7.3.1启动指定JDK11
    查看>>