61. 旋转链表【 力扣(LeetCode) 】

零、原题链接


61. 旋转链表

一、题目描述

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

二、测试用例

示例 1:

在这里插入图片描述

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

在这里插入图片描述

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

链表中节点的数目在范围 [0, 500]-100 <= Node.val <= 100
0 <= k <= 2 * 109

三、解题思路

3.1 三步走战略

  1. 基本思路:
      先反转整个链表,再反转前 k 个结点,再反转后 n-k 个结点。【 k 是求余整个链表长度后的 k】
  2. 具体思路:
    • 定义:函数 reverse ,用于反转链表(使用头插法实现);
    • 预处理:
      • 计算长度,提前返回不需要移动的情况;
      • 增加头指针,方便后续操作;
    • 三步走:
      • 先反转整个链表;
      • 拆分链表,前 k 个为一个链表,后 n-k 个为一个链表;
      • 反转拆分后的两个链表;
      • 合并拆分后的两个链表;

3.2 闭合+断开

  • 先计算链表长度,提前返回不需要移动的情况;
  • 将链表闭合,形成一个环;
  • 确定链表的最后一个结点和头结点,遍历到该结点并断开;

例如:

  • 链表:abcde ,k = 2 ;
  • 计算链表长度 n = 5 ;
  • 链表闭环;
  • 确定最后一个链表的位置 = n - (k%n) = 5 - (2%5)=3 ,所以第 3 个 结点就是最后一个结点,那么第 4 个结点就是头结点;【往右移动两次,c 就是最后一个结点,d 就是头结点】

四、参考代码

4.1 三步走战略

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( 1 ) \Omicron(1) O(1)

/*** 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* reverse(ListNode* head) {ListNode* ans = new ListNode();ListNode *p = head, *t = nullptr;while (p != nullptr) {t = p->next;p->next = ans->next;ans->next = p;p = t;}return ans->next;}ListNode* rotateRight(ListNode* head, int k) {int n = 0;for (ListNode* p = head; p != nullptr; p = p->next)n++;if (n == 0 || k % n == 0)return head;ListNode* ans = new ListNode(0, head);ans->next = reverse(ans->next); // 全部反转ListNode* p = ans;for (k %= n; k > 0; k--)p = p->next;head = p->next;p->next = nullptr;p = ans->next;ans->next = reverse(ans->next); // 反转前 k 个p->next = reverse(head);        // 反转后 n-k 个并拼接链表return ans->next;}
};

4.2 闭合+断开

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( 1 ) \Omicron(1) O(1)

/*** 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* rotateRight(ListNode* head, int k) {int n = 0;ListNode* ans = new ListNode(0, head);ListNode* p = ans;while (p->next != nullptr) {p = p->next;n++;}if (n == 0 || k % n == 0) {return head;}p->next = ans->next;  // 闭合for (int i = n - (k % n); i > 0; i--) { // 确定最后一个结点位置p = p->next;}ans->next = p->next; // 确定头结点p->next = nullptr;	// 断开return ans->next;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/879925.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI小项目4-用Pytorch从头实现Transformer(详细注解)

目录 一、前期准备工作学习如何读AI论文读Transformer原始论文用Pytorch从头实现Transformer 二、我的完整代码实现1.导入库2.基本组件创建词嵌入位置嵌入自注意力 3.编码器4.解码器5.完整架构6.简单测试一下代码创建模型和准备简单的训练数据训练一次&#xff08;前向传播&…

Istio下载及安装

Istio 是一个开源的服务网格&#xff0c;用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档&#xff1a;https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件&#xff0c;或者自动…

Python数据分析与可视化(Python绘图详解)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

6张图掌握提示词工程师工作范围与工作技巧(提示词原理篇)

在人工智能的疆域中&#xff0c;提示词工程师扮演着至关重要的角色。他们精心设计的话语&#xff0c;是引导AI模型理解人类需求、激发创造力的关键。如同指挥官的号令&#xff0c;提示词工程师的每一个提问&#xff0c;都让AI的潜力得到释放&#xff0c;让技术与智慧的对话更加…

skip list

无标题 #include <iostream> #include <cstdlib> #include <cstdint> #include <cstring> #include <ctime>#define SKIP_LIST_MAX_LEVEL 4// 跳表连接item typedef struct skip_list_item {struct skip_list_node *prev; // 上一个节点指针&…

群晖NAS使用Docker本地部署网页版Ubuntu系统并实现无公网IP远程访问

文章目录 前言1. 下载Docker-Webtop镜像2. 运行Docker-Webtop镜像3. 本地访问网页版Linux系统4. 群晖NAS安装Cpolar工具5. 配置异地访问Linux系统6. 异地远程访问Linux系统7. 固定异地访问的公网地址 前言 本文旨在详细介绍如何在群晖NAS部署docker-webtop&#xff0c;并结合c…

电力电塔电线缺陷检测数据集 voc yolo

电力 电塔电线缺陷检测数据集 10000张 带标注 voc yolo 电力电塔电线缺陷检测数据集 数据集描述 该数据集旨在用于电力电塔和电线的缺陷检测任务&#xff0c;涵盖多种常见的缺陷类型。数据集包含了大量的图像及其对应的标注信息&#xff0c;可用于训练计算机视觉模型&#x…

c++运行.h和.cpp格式代码_windows

1、main.cpp 一个主程序文件&#xff0c;这是主程序文件&#xff0c;调用了 TestClass 类中的方法。 #include "TestClass.h" #include <iostream>int main() {TestClass testObj; // 创建TestClass类的对象testObj.printMessage(); // 调用类的方法std::co…

Linux:进程(一)

目录 一、概念的理解 二、指令操作 一、概念的理解 在许多地方对进程的定义都是这样的一句话&#xff1a;加载到内存中的程序、正在运行的程序、进程可以排队 而要真正理解进程是什么&#xff0c;这一句话的解释远远不够。 在定义进程之前&#xff0c;先来理解程序&#xff0…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

网关过滤器(Gateway Filter)

网关过滤器&#xff08;Gateway Filter&#xff09;是在微服务架构中&#xff0c;特别是在使用Spring Cloud Gateway等API网关时&#xff0c;用于拦截并处理进出网络请求的重要组件。它们允许开发者在请求被路由到目标服务之前或响应被返回给客户端之后&#xff0c;对请求和响应…

MATLAB系列06:复数数据、字符数据和附加画图类

MATLAB系列06&#xff1a;复数数据、字符数据和附加画图类 6. 复数数据、字符数据和附加画图类6.1 复数数据6.1.1 复变量&#xff08; complex variables&#xff09;6.1.2 带有关系运算符的复数的应用6.1.3 复函数&#xff08; complex function&#xff09;6.1.4 复数数据的作…

expressjs 如何封装接口响应数据

在 Express.js 中封装接口响应数据是一个常见的需求,它有助于保持 API 响应的一致性、易于维护和调试。封装响应数据通常涉及创建一个或多个中间件或工具函数,这些函数可以处理诸如设置状态码、构造响应体、添加通用头部等任务。 以下是一个简单的示例,展示了如何在 Expres…

QUIC 和 HTTP/3:提升网络性能的关键技术

一、引言 1.1 简要介绍 QUIC 和 HTTP/3 QUIC&#xff08;Quick UDP Internet Connections&#xff09;是一种基于 UDP 的传输层协议&#xff0c;旨在解决 TCP 在高延迟和丢包环境下的性能问题。HTTP/3 则是 HTTP 协议的最新版本&#xff0c;它基于 QUIC 协议而非 TCP&#xf…

【笔记】时间复杂度

文章目录 时间复杂度概念常见的时间复杂度时间复杂度的衡量常数时间例子线性时间例子平方时间例子对数时间例子 时间复杂度概念 时间复杂度&#xff1a;衡量算法随着输入量增长&#xff0c;执行时间的增长速度。 一般来说&#xff0c;肯定是希望时间复杂度小点比较好。 常见…

linux文件同步、传输

使用rsync 适合用于大量文件多次同步&#xff0c;此工具是增量的同步&#xff0c;即如果之前同步过一次了&#xff0c;后续再同步&#xff0c;他只会传输有变化、新增的文件&#xff0c;就是之前同步过的文件如果没有变化&#xff08;文件大小、修改时间等判断&#xff09;就不…

Python使用虚拟环境解决依赖冲突

在处理多个 Python 库依赖时&#xff0c;遇到依赖冲突是很常见的&#xff0c;特别是当项目依赖的库版本相互不兼容时。要解决这些冲突&#xff0c;可以采用以下方式。 1. 虚拟环境的使用 为了避免系统级和用户级包的冲突&#xff0c;建议你使用 虚拟环境。虚拟环境为每个项目…

【FPGA】编程方式

FPGA编程方式 1 什么是PLD&#xff1f;2 什么是颗粒度&#xff1f;3 可编程逻辑器件的编程方式有哪些&#xff1f;3.1 SRAM 编程技术3.2 Flash/EEPROM 编程技术3.3 反熔丝编程技术3.4 编程技术比较 参考资料 1 什么是PLD&#xff1f; 可编程逻辑器件 英文全称为&#xff1a;pr…

SpringBoot 数据库表结构文档生成

官方地址&#xff1a;https://github.com/pingfangushi/screw screw 螺丝钉&#xff0c;支持以下数据库 MySQL MariaDB TIDB Oracle SqlServer PostgreSQL Cache DB&#xff08;2016&#xff09; 生产文档支持 html word markdown 开始 添加依赖 <!-- 螺丝钉 --><…

【Kubernetes】常见面试题汇总(二十九)

目录 81.简述你知道的几种 CNI 网络插件&#xff0c;并详述其工作原理。K8s 常用的CNI网络插件&#xff08;calico && flannel&#xff09;&#xff0c;简述一下它们的工作原理和区别。 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff…