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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-list

思路:链表旋转->环形链表->%取模

新链表的尾部应该是 (n - k % n ) - 1 

代码:

复制代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* rotateRight(ListNode* head, int k) {
14         if (k == 0 || !head || !head->next) 
15             return head;
16         int n = 0;
17         ListNode* pTail = head, *pNewTail = head;
18         
19         while (pTail->next) {
20             ++n;
21             pTail = pTail->next;
22         }
23         ++n;
24         //求新链表头的位置
25         int mov = n - (k % n);
26 
27         if (mov == n) {
28             return head;
29         } 
30         pTail->next = head;//若不是旋转n的整数倍,环状链表
31 
32         while (--mov) {//新链表尾应为mov-1
33             pNewTail = pNewTail->next;
34         }
35         //解环
36         head = pNewTail->next;
37         pNewTail->next = nullptr;
38         
39         return head;
40     }
41 };
复制代码

 

posted @   仓隽  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示