C++实现LeetCode(92.倒置链表之二)

C++实现LeetCode(92.倒置链表之二)的完整攻略如下:

题目描述

给你一个单链表的头节点 head 和两个整数 leftright 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的单链表。

解题思路

这是一道链表题目。要反转从位置left到位置right的链表节点,可以按照以下步骤进行:

  1. 先找到要反转前面的那个节点pre_left,和要反转节点最后面的那个节点pos_right。
  2. 记录pos_right之后的节点next_right。
  3. 将链表从left到right的部分进行反转。
  4. 将pre_left的next节点指向反转后的链表头节点,将反转后的链表尾节点指向next_right。

具体实现可以参考下面的代码。

代码实现

#include<iostream>
#include<vector>
using namespace std;

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if(!head || !head->next)    return head;  // 特判,如果链表为空或者只有一个节点,则返回head

        ListNode* dummy = new ListNode(-1);   // 定义一个虚拟头节点,便于处理特殊情况
        dummy->next = head; // 虚拟头节点的next指向head

        ListNode* pre_left = dummy, *pos_right = dummy; // 定义pre_left和pos_right(初始值为dummy)
        for(int i = 1; i < left; ++i)
            pre_left = pre_left->next;
        for(int i = 1; i <= right; ++i)
            pos_right = pos_right->next;

        ListNode* next_right = pos_right->next;    // 记录pos_right之后的节点
        pos_right->next = NULL; // 将pos_right之后的节点断开

        ListNode* left_node = pre_left->next; // 记录要反转节点的头节点
        ListNode* reverse_head = reverseList(pre_left->next);  // 反转left到right之间的节点
        pre_left->next = reverse_head;  // 将pre_left的next节点指向反转后的链表头节点
        left_node->next = next_right;   // 将反转后的链表尾节点指向next_right

        return dummy->next;
    }

    ListNode* reverseList(ListNode* head) {  // 反转整个链表
        if(!head || !head->next)    return head;
        ListNode* p = reverseList(head->next);   // p指向反转后的链表头结点,即原链表的尾结点
        head->next->next = head;    // 反转当前节点和下一个节点
        head->next = NULL;  // 反转后将当前节点的next置为NULL
        return p;   // 返回反转后的链表头结点
    }
};

示例说明

输入: 1->2->3->4->5->NULL, left = 2, right = 4

输出: 1->4->3->2->5->NULL

输入: 5, left = 1, right = 1

输出: 5

以上就是C++实现LeetCode(92.倒置链表之二)的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(92.倒置链表之二) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 完整的Android MVP开发之旅

    完整的Android MVP开发之旅攻略 1. 什么是Android MVP模式? Android MVP(Model-View-Presenter)是一种软件架构模式,用于将Android应用程序的逻辑与界面分离。它将应用程序分为三个主要组件:Model(模型)、View(视图)和Presenter(展示器)。 Model:负责处理数据和业务逻辑。它可以是…

    other 2023年7月27日
    00
  • 太吾绘卷更新后卡顿怎么办 更新后卡顿原因及解决方法介绍

    太吾绘卷更新后卡顿怎么办? 如果你在新的太吾绘卷更新后游戏出现了卡顿,可能是由于以下原因: 系统配置不足; 游戏设置过高; 游戏更新时出现了异常; 游戏文件损坏; 电脑中存在病毒或恶意软件。 接下来详细介绍解决方法: 方法一:检查系统配置 首先检查一下你的电脑是否满足游戏的要求。太吾绘卷官方要求电脑的系统为Windows 7以上,需要内存4GB及以上。如果你…

    other 2023年6月27日
    00
  • Android文件读写的几种方式

    以下是关于Android文件读写的几种方式的完整攻略: Android文件读写的几种方式 1. 使用File类进行文件读写 可以使用Java的File类来进行文件读写操作。以下是一个示例: File file = new File(\"path/to/file.txt\"); try { // 文件写入 FileWriter writer…

    other 2023年10月14日
    00
  • Javascript中字符串相关常用的使用方法总结

    Javascript中字符串相关常用的使用方法总结 在Javascript中,字符串是一种常见的数据类型。在日常的开发过程中,对于字符串的处理十分重要。本篇文章将对Javascript中字符串相关常用的使用方法进行总结,旨在帮助读者更加深入地理解和运用字符串类型的相关知识。 1. 创建字符串 使用单引号创建一个字符串: var str1 = ‘hello w…

    other 2023年6月20日
    00
  • cmd copy命令 文件复制

    cmd copy命令 文件复制攻略 在CMD(命令提示符)中,使用copy命令可以将文件从一个位置复制到另一个位置。以下是使用copy命令复制文件的详细步骤和示例。 步骤1:打开CMD 首先需要打开CMD终端窗口。在Windows的开始菜单中,可以找到“命令提示符”或者直接在运行框中输入“cmd”。 步骤2:进入需要操作的目录 在开始操作前,需要先进入需要操…

    other 2023年6月26日
    00
  • Hadoop自学系列集(三) — Hadoop安装

    Hadoop自学系列集(三) — Hadoop安装 本文将介绍如何安装配置Hadoop单机伪分布式环境,以及如何验证Hadoop安装是否成功。 准备工作 在开始安装Hadoop之前,需要进行以下准备工作: Java环境:Hadoop是基于Java编写的,因此需要先安装Java环境,版本需为Java 8及以上版本。 Hadoop安装包:可以从官网http:…

    其他 2023年3月28日
    00
  • webstorm10配置

    WebStorm 10 配置 WebStorm 10 是一个非常专业好用的 JavaScript 开发工具,在开发 JavaScript 项目时非常有用。WebStorm 10 具有许多强大的功能和工具,但在使用之前,我们需要对其进行配置。 安装 WebStorm 10 WebStorm 10 可以从官方网站 http://www.jetbrains.com…

    其他 2023年3月28日
    00
  • centos7增加永久静态路由

    CentOS7增加永久静态路由 在 CentOS 7 中,我们可以通过添加永久静态路由来实现使某些 IP 地址或网段走指定的网卡和路由。本文将介绍如何在 CentOS 7 中配置添加基于网关的静态路由。 确定网关 在 CentOS 7 中增加永久静态路由需要知道目标网段或 IP 所在的网关。我们可以通过执行以下命令来查看当前主机所连接的网关: route -…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部