【算法】链表:92.反转链表(medium)+双指针

ops/2024/10/10 20:34:49/

 系列专栏

《分治》

《模拟》

《Linux》


目录

1、题目链接 

2、题目介绍

3、解法 (双指针)

4、代码


是 206. 反转链表 - 力扣(LeetCode)的类型题,且难度提升,可以先完成206,然后参照206的思路,解决本题。

1、题目链接 

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

2、题目介绍

3、解法 (双指针)

  1. 创建虚拟节点
    • 为了简化边界情况的处理,尤其是当left为1时,即需要翻转的链表部分从头节点开始,此时我们难以直接操作头节点。因此,我们创建一个虚拟节点dummy,其next指向原链表的头节点head。这样,我们总可以操作dummy->next而无需担心修改原始头节点。
  2. 定位left位置的前一个节点
    • 我们需要遍历链表直到left-1的位置,以便找到left位置节点的前一个节点。这个节点在后续翻转过程中将作为新链表的尾部节点(因为它后面接的是需要翻转的部分),并且在翻转完成后,它将指向翻转后部分的新头节点。
    • 变量cur用于遍历链表,直到它指向left位置的前一个节点。
    • 终止位置是left-1。
  3. 准备翻转
    • pre指向left位置的节点,这是翻转部分的起始节点。
    • lLEFT存储left位置前一个节点的引用,这样在翻转后,我们可以将其与翻转后的链表部分重新链接。
  4. 执行翻转
    • 我们需要翻转从leftright的节点。
    • 使用三个指针pre(当前节点的前一个节点),pre->next(当前节点),和tmp(当前节点的下一个节点)。
    • 翻转操作通过改变节点间的next指针来实现:将当前节点的next指向它的前一个节点pre,然后移动precur指针到下一个节点。
    • 循环继续直到cur到达right位置的节点。此时,pre指向right位置的下一个节点,而cur指向right位置的节点。
  5. 重新链接
    • 翻转完成后,我们需要将翻转后的部分与链表的其他部分重新链接。
    • lLEFT->next->next指向right位置之后的节点(即pre),这是因为lLEFT->next现在是翻转部分的新头节点(原right位置的节点),而我们需要将它的next指向翻转部分之后的节点。
    • lLEFT->next指向翻转部分的新头节点(即原right位置的节点,现在的cur)。
  6. 返回结果
    • 虚拟节点dummynext指向原始链表的头节点或翻转后的新头节点(如果翻转从头部开始)。因此,返回dummy->next即可得到最终翻转后的链表。

4、代码

/*** 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* dummy = new ListNode(0);//虚拟结点dummy->next = head;ListNode* cur= dummy;//找到left位置的前一个结点for (int i = 0; i < left - 1; i++){cur = cur->next;}ListNode* pre = cur->next;ListNode* lLEFT= cur;//用来存储left位置的前一个结点//翻转区域//保存头尾结点,方便之后和其他区域链接for (int i = left - 1; i < right; i++){ListNode* tmp = pre->next;pre->next = cur;cur = pre;//cur最后会是right对应的结点pre = tmp;//PRE最后会是right的下一个结点}//链接翻转区域lLEFT->next->next = pre;lLEFT->next = cur;return dummy->next;}
};

💗感谢阅读!💗



http://www.ppmy.cn/ops/123640.html

相关文章

Flutter String 按 ,。分割

在 Flutter 中&#xff0c;如果你想将一个字符串按特定的字符&#xff08;例如中文逗号 &#xff0c; 和英文句号 .&#xff09;进行分割&#xff0c;可以使用 Dart 语言的字符串处理功能。具体来说&#xff0c;你可以使用 split 方法&#xff0c;并传入一个正则表达式来匹配这…

【Redis】持久化(上)---RDB

文章目录 持久化的概念RDB手动触发自动触发bgsave命令的运行流程RDB文件的处理RDB的优缺点RDB效果展示 持久化的概念 Redis支持AOF和RDB两种持久化机制,持久化功能能有效的避免因进程退出而导致的数据丢失的问题,当下次重启的时候利用之前持久化的文件即可实现数据恢复. 所以此…

c++ 知识点总结

c标准库。算法加lambda表达式 在 C 中&#xff0c;lambda 表达式的捕获变量指的是&#xff0c;lambda 表达式中使用到的外部作用域的变量。这些外部变量在 lambda 表达式中被称为“捕获变量”。Lambda 通过捕获机制可以访问这些变量&#xff0c;而不用显式地将它们作为参数传递…

微信小程序实战教程:如何使用map组件实现地图功能

在微信小程序中&#xff0c;map组件是一个非常实用的功能&#xff0c;它可以帮助我们快速实现地图展示、定位、标注等操作。本文将详细介绍如何在微信小程序中使用map组件&#xff0c;带你轻松掌握地图开发技能。 一、map组件概述 map组件是微信小程序官方提供的一个地图组件…

html中视口单位是怎么用

视口单位&#xff08;viewport units&#xff09;是相对视口大小&#xff08;浏览器窗口的大小&#xff09;进行计算的单位。在网页设计中&#xff0c;视口可以理解为浏览器显示内容的区域。视口单位主要有四种&#xff1a;vw、vh、vmin 和 vmax。 四种视口单位 vw&#xff08…

R语言绘制柱状图

柱状图是一种数据可视化工具。由 x 轴和 y 轴构成&#xff0c;x 轴表示类别&#xff0c;y 轴为数据数值。以矩形柱子展示数据大小&#xff0c;便于直观比较不同类别数据差异及了解分布。广泛应用于销售分析、统计、项目管理、科学研究等领域。可定制颜色、宽度等属性&#xff0…

转型AI产品经理需要掌握的硬知识、经理能力模型和常见AI概念梳理

近几年&#xff0c;从亚马逊&#xff0c; Facebook&#xff0c;到谷歌&#xff0c;微软&#xff0c;再到国内的BAT&#xff0c;全球最具影响力的技术公司都将目光转向了人工智能&#xff08; AI &#xff09;。2016年 AlphaGo 战胜李世石&#xff0c;把公众的目光也聚集到了人工…

k8s 中存储之 emptyDir 卷

目录 1 kubernets支持的卷的类型 2 emptyDir 卷介绍 2.1 emptyDir 的使用场景&#xff1a; 2.2 emptyDir 卷的功能&#xff1a; 3 emptyDir 卷实现容器间数据共享 3.1 实验介绍 3.2 创建 Pod 清单文件 3.3 修改 Pod 清单文件 3.4 声明清单文件并查看 Pod 是否正确创建 3.5 修改…