Leetcode 107 旋转链表

1 题目

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

2 代码实现

c++

/** * 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 || k == 0 ){ return head ; } int n = 1; ListNode* tail = head ; while (tail -> next != nullptr){ tail = tail -> next ; n++; } int step = k % n ; if (step == 0 ){ return head ; } tail -> next = head ; ListNode* new_tail = head ; for (int i = 0 ; i < n - step - 1 ; ++i){ new_tail = new_tail -> next ; } ListNode* new_head = new_tail -> next ; new_tail -> next = nullptr ; return new_head; } };

js

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} head * @param {number} k * @return {ListNode} */ var rotateRight = function(head, k) { if (head == null || head.next == null || k == 0){ return head ; } let n = 1 ; let tail = head ; while(tail.next != null){ tail = tail.next ; n++; } tail.next = head ; let step = k % n ; let new_tail = head ; for(let i = 0 ; i < n - step - 1 ; i++){ new_tail = new_tail.next ; } const new_head = new_tail.next ; new_tail.next = null ; return new_head; };

思考

这道题目我觉得k就是一个“旋转”操作的执行次数,比较难的地方就是尾部的结点要怎么又接回来。

我大概的思路就是建立一个虚拟头结点dummy,cur从head 出发 ,然后dummy -> next = cur -> next ;这么一直往后“旋转”连接,直到cur -> next 是空的了,再把原来的头结点接回来?

不知道怎么写,需要看看cpp实现的题解,我怎么想都觉得这个新的head写法有点麻烦。

题解

解题思路分析

首先要明确一个关键点:如果链表长度为n,那么向右移动k个位置等价于向右移动k % n个位置(因为移动n个位置后链表会回到原样)。这能避免k过大时的无效操作。

解决这个问题的核心步骤:

  1. 处理特殊情况(空链表、k=0、链表只有 1 个节点),直接返回原链表;
  2. 遍历链表,统计节点总数n,同时找到链表的尾节点;
  3. 计算有效移动步数step = k % n,如果step=0直接返回原链表;
  4. 将链表首尾相连,形成环形链表;
  5. 找到新的尾节点(原链表的第n-step个节点),断开环形链表,新的头节点就是尾节点的下一个节点。

C++ 完整实现代码

#include <iostream> using namespace std; // 定义链表节点结构 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) { // 特殊情况:空链表、只有一个节点、k=0,直接返回原链表 if (head == nullptr || head->next == nullptr || k == 0) { return head; } // 第一步:统计链表节点数n,并找到尾节点tail int n = 1; // 至少有一个节点(head非空) ListNode* tail = head; while (tail->next != nullptr) { tail = tail->next; n++; } // 第二步:计算有效移动步数(k可能远大于n) int step = k % n; if (step == 0) { // 移动n的倍数,链表不变 return head; } // 第三步:将链表连成环形(尾节点指向头节点) tail->next = head; // 第四步:找到新的尾节点(距离原头节点n-step-1步) ListNode* new_tail = head; for (int i = 0; i < n - step - 1; i++) { new_tail = new_tail->next; } // 第五步:新的头节点是新尾节点的下一个节点,断开环形链表 ListNode* new_head = new_tail->next; new_tail->next = nullptr; return new_head; } }; // 辅助函数:打印链表 void printList(ListNode* head) { while (head != nullptr) { cout << head->val << " "; head = head->next; } cout << endl; } // 测试用例 int main() { // 示例1:head = [1,2,3,4,5], k=2 ListNode* head1 = new ListNode(1); head1->next = new ListNode(2); head1->next->next = new ListNode(3); head1->next->next->next = new ListNode(4); head1->next->next->next->next = new ListNode(5); Solution s; ListNode* res1 = s.rotateRight(head1, 2); cout << "示例1输出:"; printList(res1); // 预期输出:4 5 1 2 3 // 示例2:head = [0,1,2], k=4 ListNode* head2 = new ListNode(0); head2->next = new ListNode(1); head2->next->next = new ListNode(2); ListNode* res2 = s.rotateRight(head2, 4); cout << "示例2输出:"; printList(res2); // 预期输出:2 0 1 return 0; }

代码关键部分解释

  1. 特殊情况处理:避免无意义的计算,比如空链表、单节点链表无需旋转,直接返回;
  2. 统计节点数 + 找尾节点:这一步是为了后续计算有效步数,同时为连成环形链表做准备;
  3. 有效步数计算k % n是核心优化,比如示例 2 中k=4n=3,有效步数是1(4%3=1),等价于向右移动 1 个位置;
  4. 环形链表处理:将尾节点指向头节点,这样旋转时无需反复遍历,只需找到新的头尾节点即可;
  5. 找新的头尾节点
    • 新尾节点位置:原链表的第n-step-1个节点(比如示例 1 中n=5step=2,新尾节点是第5-2-1=2个节点,即值为 3 的节点);
    • 新头节点是新尾节点的下一个节点(示例 1 中是 4),最后断开环形链表(新尾节点的 next 置空)。

总结

  1. 核心优化点:用k % n减少无效旋转,避免k过大时的性能问题;
  2. 关键技巧:将链表连成环形,通过找节点位置直接确定新的头尾,无需逐次旋转;
  3. 步骤逻辑:统计长度→算有效步数→连环形→找新头尾→断环形。

这种方法的时间复杂度是 O (n)(只遍历链表两次),空间复杂度是 O (1)(只使用了几个指针变量),是最优的解法。

3 小结

变成环形以后再求解,然后断链,我觉得虽然我们走测试用例的时候是这么想的,但我实际却没有用这样成环又断链的办法在做,见多识广吧,我个人感受是见过这个做法就知道,没见过就不知道,会者不难,难者不会,也不必太担忧。

  1. 先统计长度是链表题的常见套路很多链表题目,只要涉及 “旋转”“倒数第 k 个”“环” 等,都需要先知道链表长度,这一步往往能带来后续的巨大简化。

  2. k 可能非常大,必须用 k % n 来减少无效操作题目给的 k 可以达到 2×10^9,如果不做取模,直接模拟肯定超时。取模后问题规模瞬间缩小到链表长度范围内。

  3. 成环操作让 “旋转” 变成了 “找节点 + 断链”把链表首尾相连后,旋转 k 次等价于在环中找到新的尾节点,然后断开环。这个思路非常巧妙,也非常高效。

  4. 新尾节点的位置公式 n - step - 1 是关键理解这个公式的推导过程后,整个题就变得非常清晰:新尾节点就是原链表中 “倒数第 step+1 个节点”。

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

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

相关文章

数据工程新范式:基于 NoETL 语义编织实现自助下钻分析

将分析需求响应时间从“周级”缩短至“分钟级”,实现真正的自助探索与归因分析。本文首发于 Aloudata 官方技术博客:《数据分析师如何能不依赖 IT,自助完成任意维度的下钻分析?》 转载请注明出处。 摘要:本文探讨…

2026年 吸塑品牌实力推荐榜:专业厂家深度解析,涵盖厚片吸塑、精密吸塑、大型吸塑制品的优质品牌全景测评

2026年吸塑品牌实力推荐榜:专业厂家深度解析,涵盖厚片吸塑、精密吸塑、大型吸塑制品的优质品牌全景测评 在当今制造业持续升级与产品个性化需求日益增长的背景下,塑料吸塑成型技术凭借其高效、灵活、成本可控的优势…

2026四川护栏网优质产品推荐榜

2026四川护栏网优质产品推荐榜一、行业背景与榜单价值据《2026-2030年中国护栏网行业市场调研及发展前景预测报告》显示,西南地区护栏网市场规模年增速达8.2%,四川作为基建核心区域,市政道路、交通工程、养殖基地等…

PWR电源控制

PWR简介PWR(Power Control)电源控制PWR负责管理STM32内部的电源供电部分,可以实现可编程电压监测器和低功耗模式的功能可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阈值以下或上升到PVD阈值之上时,…

基于容器化的边缘计算网关应用部署实践:Python+MQTT

摘要&#xff1a; 传统的嵌入式开发面临交叉编译复杂、环境依赖难以管理等难题。利用容器化技术&#xff0c;我们可以将云原生的开发体验带入边缘侧。本文将以鲁邦通EG3110为硬件平台&#xff0c;演示如何构建一个Python数据处理容器&#xff0c;并通过MQTT与内置的 E2C Factor…

计算机毕业设计springboot机票订购系统的设计与实现 基于Spring Boot框架的在线机票预订系统开发与实践 利用Spring Boot实现的机票预订平台设计与应用

计算机毕业设计springboot机票订购系统的设计与实现gz7et &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 随着信息技术的飞速发展&#xff0c;传统的机票订购方式已无法满足现…

计算机毕业设计springboot智慧乡村服务平台 基于Spring Boot框架的智慧乡村综合服务平台设计与实现 Spring Boot驱动的智慧乡村服务系统开发与应用

计算机毕业设计springboot智慧乡村服务平台z7y9z &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;乡村地区的数字化转型成为推动乡村振兴的重…

震惊!腾讯企业邮箱在梅州竟有这样的服务商内幕!

深度解析&#xff1a;腾讯企业邮箱在梅州的技术服务商——广东企拓网络科技有限公司的技术突破与实战验证 一、痛点深度剖析&#xff1a;企业邮箱的"最后一公里"困境 在数字化转型浪潮中&#xff0c;企业邮箱作为核心通信工具&#xff0c;却常面临三大技术困境&…

全球主流进口电子秤制造商综合实力全景对比与评析

一、行业背景:精密称重技术的时代价值 电子秤作为现代工业、商业和科研领域的基础计量设备,已从简单的称重工具演变为集传感技术、数据处理、自动化控制于一体的智能系统。在全球制造业转型升级、质量管控要求日益严…

2026年 塑料板材厂家推荐排行榜:ABS/PS/PP/PE/PET/PVC板材,精选高韧性耐腐蚀工程塑料板材优质品牌!

2026年塑料板材厂家推荐排行榜:ABS/PS/PP/PE/PET/PVC板材,精选高韧性耐腐蚀工程塑料板材优质品牌! 在当今制造业升级与新材料应用日益广泛的背景下,工程塑料板材作为关键的基础材料,其性能与品质直接关系到终端产…

成都附近打印机出租公司、成都附近打印机租赁、成都附近打印机租赁公司、成都周边打印机出租、成都周边打印机租赁、成都彩色打印机出租选择指南

2026成都金融行业打印机出租优质品牌推荐据《2026-2026中国办公设备租赁行业白皮书》数据显示,成都地区打印机出租市场年增长率达18%,金融行业作为高频打印需求场景,对设备稳定性、打印精度及服务响应速度的要求尤为…

核心技术大起底:看这几家真空石墨炉/碳管炉厂家如何掌握加热体命脉

一、行情分析:加热体——真空高温炉的“心脏”在真空石墨炉和碳管炉的技术体系中,加热体无疑是整个设备的“心脏”。它直接决定了炉膛的最高温度、升温速率、温度均匀性以及设备的使用寿命。当前,真空高温炉市场的竞…

车铣复合加工机床品牌推荐:用户口碑与型号全攻略

车铣复合加工机床,作为一种革命性的加工设备,凭借其“一次装夹,全部完工”的卓越能力,已成为现代精密制造领域不可或缺的核心装备。它将车削、铣削、钻孔、攻牙等多种工艺高度集成,能极大提升加工效率与精度,在航…

【JavaWeb】HttpServletRequest_获得请求中的键值对参数相关API - 实践

【JavaWeb】HttpServletRequest_获得请求中的键值对参数相关API - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &…

卫生初中级职称考试题库深度测评 在职备考高性价比之选

卫生初中级职称备考生多为医院、疾控、社区卫生服务中心的在职人员,备考面临时间零散、预算有限、怕买错题库浪费钱的困境,选对一款高性价比的题库,是在职备考高效提分的关键。为大家推荐适配在职考生的卫生初中级职…

Sufficient 英文单词学习

1️、基本信息 单词&#xff1a;sufficient 词性&#xff1a;形容词 发音&#xff1a; &#x1f1fa;&#x1f1f8; /səˈfɪʃ.ənt/&#x1f1ec;&#x1f1e7; /səˈfɪʃ.ənt/ 词源&#xff1a; 来自拉丁语 sufficiens&#xff08;足够的&#xff09; → sufficient …

INVICTA BLz05-2/4 底座安装式电动振动电机

INVICTA BLz05-2/4底座安装式电动振动电机&#xff0c;作为BLz系列轻中型主力机型&#xff0c;传承英国品牌75年工业振动技术积淀&#xff0c;专为中小型散料处理场景打造高效灵活的激振动力解决方案。产品采用轻量化高强度底座设计&#xff0c;刚性固定结构紧凑可靠&#xff0…

2026铜接触网线市场增长:电气化铁路与城市轨道交通中的关键角色

随着全球电气化进程的加快&#xff0c;铜接触网线作为电能传输的关键组件&#xff0c;在电气化铁路、城市轨道交通及工业电气化领域中扮演着不可或缺的角色。据QYResearch最新调研显示&#xff0c;至2025年&#xff0c;全球铜接触网线市场规模预计达到约56.84亿美元&#xff0c…

强烈安利继续教育TOP10AI论文平台:写论文不再难

强烈安利继续教育TOP10AI论文平台&#xff1a;写论文不再难 2026年继续教育AI论文平台测评&#xff1a;为何需要这份权威榜单 随着人工智能技术的快速发展&#xff0c;AI写作工具在学术领域的应用日益广泛。对于继续教育群体而言&#xff0c;撰写高质量论文不仅是学习成果的体现…

ICML2025|宁波东方理工大学刘野,陈云天:DragSolver:用于真实汽车风阻系数估计的多尺度Transformer方法

DragSolver: A Multi-Scale Transformer for Real-World Automotive Drag Coefficient Estimation 刘野&#xff0c;陈云天 宁波东方理工大学&#xff0c;上海交通大学 引用格式&#xff1a; Liu Y, Chen Y. DragSolver: A Multi-Scale Transformer for Real-World Automotiv…