当前位置: 首页 > news >正文

反转链表2(92)

92. 反转链表 II - 力扣(LeetCode)

相关题目:206. 反转链表 - 力扣(LeetCode)

解法:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) 
    {

        ListNode *dummyNode = new ListNode(-1);
        dummyNode->next = head;

        ListNode * tmp = head;
        ListNode * left_p = nullptr;
        ListNode * right_p = nullptr;
        //记录left_pre_p,right_post_p,可以节省一遍遍历操作
        ListNode * left_pre_p = dummyNode;
        ListNode * right_post_p = nullptr;

        int cnt = 1;

        while (1) {
            if (cnt == left - 1) {
                left_pre_p = tmp;
            }
            if (cnt == left) {
                left_p = tmp;
            }
            if (cnt == right) {
                right_p = tmp;
            }
            
            if (cnt == right + 1) {
                right_post_p = tmp;
                break;
            }

            cnt += 1;
            tmp = tmp->next;
        }

        reverseBetweenCore(left_p, right_p);

        left_pre_p->next = right_p;
        left_p->next = right_post_p;
        
        return dummyNode->next;
    }
    
    void reverseBetweenCore(ListNode * left, ListNode * right) 
    {
    
        ListNode * pre = nullptr;
        ListNode * cur = left;

        //这个条件是错误的,因为 ListNode * post = cur->next,会改变right->next,
        //所以这个条件不会发生
        // while (cur != right->next) {
        //     ListNode * post = cur->next;
        //     cur->next = pre;
        //     pre = cur;
        //     cur = post;
        // }

        while(cur != right) {
            ListNode * post = cur->next;
            cur->next = pre;
            pre = cur;
            cur = post;
        }

        cur->next = pre;
    }
};

总结:

计算时间复杂度O(N),空间复杂度O(1),相关题目解法:反转链表(206)-CSDN博客。

http://www.dtcms.com/a/20124.html

相关文章:

  • ThreadLocalRandom原理剖析
  • Spring Cloud — 深入了解Eureka、Ribbon及Feign
  • 2.【线性代数】——矩阵消元
  • C++:高度平衡二叉搜索树(AVLTree) [数据结构]
  • 【Cocos TypeScript 零基础 15.1】
  • 如何在Spring Boot中配置分布式配置中心
  • 2025-02-13 学习记录--C/C++-PTA 7-17 爬动的蠕虫
  • c#自动更新-源码
  • WPF的Prism框架的使用
  • 算法刷题-链表系列-两两交换链表结点、删除链表的倒数第n个元素
  • C#打印设计器
  • 72.git指南(简单)
  • SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现
  • DeepSeek24小时写作机器人,持续创作高质量文案
  • pnpm的使用
  • Python 字典思维导图
  • 制药行业 BI 可视化数据分析方案
  • dedecms 开放重定向漏洞(附脚本)(CVE-2024-57241)
  • Docker学习
  • dma_ddr 的编写 通过mig控制ddr3
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 13
  • 掌握SQL多表连接查询_轻松处理复杂数据关系
  • [0689].第04节:Kafka与第三方的集成 – Kafka集成SpringBoot
  • 《Spring实战》(第6版)第1章 Spring起步
  • 【数据结构】(9) 优先级队列(堆)
  • floodfill算法系列一>太平洋大西洋水流问题
  • 【第3章:卷积神经网络(CNN)——3.6 CNN的高级特性与优化策略】
  • 如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?
  • EasyExcel 复杂填充
  • DeepSeek接入网络安全领域,AI高效驱动,重新定义网络防御边界!