#Leetcode# 92. Reverse Linked List II
发布日期:2025-03-29 02:45:49 浏览次数:9 分类:精选文章

本文共 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的节点被正确反转,且链表其他部分不受影响。
    • 在链表长度较小时,需要特殊处理避免错误访问节点。

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

    上一篇:# tail -f /var/log/zabbix/zabbix_agentd.log sudo: sorry, you must have a tty to run sudo
    下一篇:Java操作Sql语句 出现迭代死循环 (Bug排查)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月27日 01时03分52秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    2024年最流行的十大开源渗透测试工具 2023-01-24
    005从零开始学Python—字符串处理 2023-01-24
    2024年网络安全八大前沿趋势,零基础入门到精通,收藏这篇就够了 2023-01-24
    2024年薪酬最高的五个网络安全职位,零基础入门到精通,收藏这一篇就够 2023-01-24
    2024年非科班的人合适转行做程序员吗? 2023-01-24
    2024数字安全创新性案例报告,从零基础到精通,收藏这篇就够了! 2023-01-24
    2024最新最全CTF入门指南(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024最新科普什么是大模型?零基础入门到精通,收藏这篇就够了 2023-01-24
    2024最新程序员接活儿搞钱平台盘点 2023-01-24
    2024最火专业解读:信息安全(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    (插播)unity的 异常捕捉和 ios Android 崩溃信息的捕捉。 2023-01-24
    2024版最新SRC漏洞挖掘思路手法(非常详细),零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024版最新渗透测试零基础入门教程,带你入门到精通(超详细),收藏这篇就够了 2023-01-24
    2024版最新网络安全入门必备读书清单(非常详细)零基础入门到精通,收藏这一篇就够了 2023-01-24
    2024版最新网络安全工程师考证指南,零基础入门到精通,收藏这篇就够了 2023-01-24
    2024版最新网络安全教程从入门到精通,看完这一篇就够了 2023-01-24