【面试经典150 | 链表】旋转链表

news2025/7/27 15:03:59

文章目录

  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:遍历
  • 其他语言
    • python3
  • 写在最后

Tag

【单向链表】


题目来源

61. 旋转链表


题目解读

旋转链表,将链表的每个节点向右移动 k 个位置。


解题思路

方法一:遍历

本题题目意思清晰,实现起来比较容易,属于链表基础知识题。

简单题我们仔细做,通过这道简答题来回顾一下单向链表的一些基本操作。

在进行具体的旋转链表操作之前,我们要先统计一下链表的长度 n,为什么?因为要 “将链表的每个节点向右移动 k 个位置”,如果 k >= n,我们只需要将链表的每个节点向右移动 k % n 个位置即更新 k %= mk / n 表示要将链表的每个节点向右移动整数个 n 位置,把长度为 n 的链表向右移动 n 个位置等于没有动。

如何求链表的长度 n ?通过迭代枚举单向链表中的所有节点,计数得到链表的长度。具体地,初始化 n = 0,从头结点出发枚举节点,枚举到一个节点 ++n,接着更新当前节点为下一个节点,直到遇到空节点表示链表迭代枚举结束,退出。

将链表的每个节点向右移动 k 个位置,那么原链表的倒数第 k 个节点就是移动后链表的最后一个非空节点,也就是空节点的前一个节点,我们需要找到该节点,然后连上空节点。并且还要将原链表的最后一个非空节点连接到原链表的头结点,这才算完成移动操作(也就是题目说的选择链表)。

在代码实现中,我们先实现的是连接头节点(也就是 官方题解 中说的闭合成环),于是需要遍历原链表找到最后一个非空节点,这个我们可以在计算链表长度的时候将原链表的最后一个非空节点记录下来。然后将移动后链表的最后一个非空节点连接到空节点上,通过从 head 节点往后迭代 n - k - 1 次即可得到移动后链表的最后一个非空节点 lastNode,而 lastNode->next 节点就是我们最终要返回的向右移动后的新链表的头节点。

实现代码

/**
 * 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) {
        if(head == nullptr || head->next == nullptr) {
            return head;
        }

        // 计算链表长度
        ListNode* curr = head;
        int n = 1;
        while(curr->next != nullptr) {
            ++n;
            curr = curr->next;
        }

        k %= n;
        if(k == 0) {
            return head;
        }

        // 连接头结点
        curr->next = head;  // 注意此行代码放置的位置

        // 找出移动后链表的最后一个非空节点
        n -= k;
        lastNode = head;
        while(--n) {
            lastNode = lastNode->next;
        }

        // 建立新的头结点
        ListNode* newHead = lastNode->next;
        lastNode->next = nullptr;
        return newHead;
    }
};

复杂度分析

时间复杂度: O ( n ) O(n) O(n) n n n 是链表的长度,最坏情况下,我们需要遍历该链表两次。

空间复杂度: O ( 1 ) O(1) O(1),我们只需要常数的空间存储若干变量。


其他语言

python3

class Solution:
    def rotateRight(self, head: ListNode, k: int) -> ListNode:
        if not head or not head.next:
            return head
        
        n = 1
        cur = head
        while cur.next:
            cur = cur.next
            n += 1
        
        k %= n
        if k == 0:
            return head;
        
        cur.next = head
        
        cur = head
        n -= k
        n -= 1
        while n:
            cur = cur.next
            n -= 1
        
        newHead = cur.next
        cur.next = None
        return newHead

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

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

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

相关文章

【Linux】jdk Tomcat MySql的安装及Linux后端接口部署

一,jdk安装 1.1 上传安装包到服务器 打开MobaXterm通过Linux地址连接到Linux并登入Linux,再将主机中的配置文件复制到MobaXterm 使用命令查看:ll 1.2 解压对应的安装包 解压jdk 解压命令:tar -xvf jdk 加键盘中Tab键即可…

企业级JAVA、数据库等编程规范之命名风格 —— 超详细准确无误

🧸欢迎来到dream_ready的博客,📜相信你对这两篇博客也感兴趣o (ˉ▽ˉ;) 📜 表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学 📜 用户登录前后端…

作为网工有必要了解一下什么是SRv6?

什么是SRv6? 【微|信|公|众|号:厦门微思网络】 【微思网络http://www.xmws.cn,成立于2002年,专业培训21年,思科、华为、红帽、ORACLE、VMware等厂商认证及考试,以及其他认证PMP、CISP、ITIL等】 SRv6&…

MFC简单字符串压缩程序

一个mfc简单字符串压缩程序;按以下情况进行压缩; 1 仅压缩连续重复出现的字符。比如”abcbc”无连续重复字符,压缩后还是”abcbc”。 2 压缩的格式为”字符重复的次数字符”。例如,”xxxyyyyyyz”压缩后就成为”3x6yz”。 void …

Centos7环境下cmake3.25的编译与安装

文章目录 0 视频传送门1 卸载当前版本2 下载cmake3.25.0并且解压缩3 使用root用户进入解压缩的目录4 开始执行命令5 创建软连接6 检查版本 0 视频传送门 https://www.bilibili.com/video/BV1Gu4y1J7Ev/?vd_source3353f83539e46042d8cf76efb177a8e4 07-Centos7编译安装cmake3.…

接口请求的六种常见方式详解(get、post、head等)

一.接口请求的六种常见方式: 1、Get 向特定资源发出请求(请求指定页面信息,并返回实体主体) 2、Post 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建…

Leetcode—485.最大连续1的个数【中等】明天修改

2023每日刷题(十五) Leetcode—2.两数相加 迭代法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l…

再现“换桥奇迹”|人大金仓助力中国移动完成营销系统国产化升级

堪称传统基建奇迹的“三元桥43小时换新桥”工程的相关报道还历历在目,而中国移动也经历着类似的考验,需要在2天内完成某在线营销系统整体升级。 作为中国移动的重要数据库产品与服务提供商,留给人大金仓的时间只有每天夜间的4小时&#xff0…

要在VMware(虚拟机)上获取相机连接状态并显示在主界面上,您可以使用以下步骤:

在VM上安装相机驱动程序:确保VM中已安装对应的相机驱动程序,以便能够连接和使用相机。 检查相机连接状态:在VM中,打开设备管理器(Device Manager)并检查相机是否显示为已连接状态。如果显示为已连接&#…

什么是 DevOps

DevOps是一套融合软件开发(Dev)和 IT 运营(Ops)的实践,旨在缩短应用程序开发周期并确保以高软件质量持续交付,通过采用 DevOps 实践,您可以帮助组织更可靠、更快速、更高效地交付软件。 什么是…

python 之正则表达式详解

文章目录 r与R原始字符串的特点:示例:正则表达式示例:文件路径示例: 有没有r 带来的影响使用 r 前缀的示例:不使用 r 前缀的示例: \b 作为单词的界限匹配以 "cat" 开头的单词:匹配以 …

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型 一、重写config文件二、开始训练三、ncnn部署 从零开始的目标检测和关键点检测(一):用labelme标注数据集 从零开始的目标检测和关键点检测…

第06章 索引的数据结构

第06章 索引的数据结构 1. 索引及其优缺点 1.1 索引概述 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 **索引的本质:**索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”&#xff…

Vue 监听属性 watchEffect

watchEffect 函数:自动收集依赖源,不用指定监听哪个数据,在监听的回调中用到哪个数据,就监听哪个数据。 而 watch 函数:既要指定监听的数据,也要指定监听的回调。 watchEffect 函数:类似于 co…

OpenCV 笔记(4):图像的算术运算、逻辑运算

Part11. 图像的算术运算 图像的本质是一个矩阵,所以可以对它进行一些常见的算术运算,例如加、减、乘、除、平方根、对数、绝对值等等。除此之外,还可以对图像进行逻辑运算和几何变换。 我们先从简单的图像加、减、逻辑运算开始介绍。后续会有…

Window下SRS服务器的搭建

---2023.7.23 准备材料 srs下载:GitHub - ossrs/srs at 3.0release 目前srs release到5.0版本。 srs官方文档:Introduction | SRS (ossrs.net) Docker下载:Download Docker Desktop | Docker 进入docker官网选择window版本直接下载。由…

SolidWorks2018安装教程(正版)

网盘资源附文末 一.简介 SolidWorks软件是世界上第一个基于Windows开发的三维CAD系统,由于技术创新符合CAD技术的发展潮流和趋势,SolidWorks公司于两年间成为CAD/CAM产业中获利最高的公司。良好的财务状况和用户支持使得SolidWorks每年都有数十乃至数百…

Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间

Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间 介绍时间戳是什么什么时候用时间戳 获取时间获取当前时间获取时间戳日期转时间戳时间戳转日期将时间戳转换为多久之前星期自定义格式时间 总结 介绍 这里附带一个时间戳和时间转换的网址 时间戳是什么 时…

Java NIO为何导致堆外内存OOM了?

Java NIO为何导致堆外内存OOM了? 描述 某天报警:某台机器部署的一个服务突然无法访问。谨记第一反应登录机器查看日志,因为服务挂掉,很可能因OOM。这个时候在机器的日志中发现了如下的一些信息: nio handle failed j…

小程序视频编辑SDK技术解决方案

传统的视频制作方式不仅耗时耗力,而且难以满足企业多样化、个性化的定制需求。为了帮助企业解决这一难题,美摄科技推出了一款专为企业量身定制的小程序视频编辑SDK技术解决方案,让您的视频制作更加高效、专业! 一、功能强大&…