061. Rotate List
题目链接:https://leetcode.com/problems/rotate-list/description/
Example 1:
Input: 1->2->3->4->5->NULL, k = 2
Output: 4->5->1->2->3->NULL
Explanation:
rotate 1 steps to the right: 5->1->2->3->4->NULL
rotate 2 steps to the right: 4->5->1->2->3->NULL
Example 2:
Input: 0->1->2->NULL, k = 4
Output:2->0->1->NULL
Explanation:
rotate 1 steps to the right: 2->0->1->NULL
rotate 2 steps to the right: 1->2->0->NULL
rotate 3 steps to the right:0->1->2->NULL
rotate 4 steps to the right:2->0->1->NULL
思路:
- 根据题意,给定了一个单链表和一个非负整数k,对链表进行k次旋转操作。每次旋转操作都是将单链表的尾结点插入到当前单链表头结点前的位置。
- 因为每次旋转操作中的插入操作部分都是要对头结点处进行操作,为了便于节点的插入,我们可以构造一个辅助节点指向链表的头结点。
- 在每次旋转操作的过程中,我们所需要进行的操作可以分解为2个步骤:
- 步骤1为找到单链表的尾结点,此处应用一个结点指针指向尾结点前的节点(因为要改变此结点的指向,让其指向nullptr,该结点变为尾结点);
- 步骤1中找到的尾结点,要将其插入到单链表的头结点前,让该结点成为单链表的头结点。
- 循环执行k次这样的操作即可。
注意:如果按照上面描述的操作进行编码实现,会出现Time Limit Exceeded的问题。
想到的可优化的部分是:对k次旋转操作部分进行优化,假设链表结点个数为n,即链表长度为n。
则旋转操作次数为loop = k % n;
因为链表进行旋转操作是以链表的长度n为周期的,即我们的旋转操作次数应小于链表的长度n。
其他可优化的部分可以继续思考。未完待续!!!
另外也要注意编码过程中的一些小细节,例如当单链表节点个数为1时,上面描述的步骤1可能会有逻辑错误(指针指向错误)。
编码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
// 链表为空,则直接返回
if (head == nullptr) return head; int cnt = ; // 统计链表节点个数
ListNode *p = head;
while (p != nullptr)
{
cnt++;
p = p->next;
} int loop = k % cnt; // 要进行旋转的次数 // 辅助节点,永远指向链表的头结点
ListNode *pHead = new ListNode(-);
pHead->next = head; ListNode *pre = nullptr; // 指向待旋转节点的前一个节点
for (int i = ; i < loop; ++i) // 进行旋转操作计数
{
ListNode *pTemp = head;
while (pTemp->next != nullptr)
{
pre = pTemp;
pTemp = pTemp->next;
} if (pre == nullptr) // 注意当链表长度为1时
{
return head;
} pre->next = nullptr; // pre成为指向链表尾结点的尾指针 // 插入查找到的结点到链表的头结点前
pHead->next = pTemp;
pTemp->next = head;
head = pTemp; // head永远指向链表的头结点
} return head;
}
};
061. Rotate List的更多相关文章
- Java for LeetCode 061 Rotate List
Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given ...
- 061 Rotate List 旋转链表
给定一个链表,将链表向右旋转 k 个位置,其中 k 是非负数.示例:给定 1->2->3->4->5->NULL 且 k = 2,返回 4->5->1-> ...
- Canvas绘图之平移translate、旋转rotate、缩放scale
画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...
- [LeetCode] Rotate Array 旋转数组
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- [LeetCode] Rotate List 旋转链表
Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...
- [LeetCode] Rotate Image 旋转图像
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- jQuery.rotate.js参数
CSS3 提供了多种变形效果,比如矩阵变形.位移.缩放.旋转和倾斜等等,让页面更加生动活泼有趣,不再一动不动.然后 IE10 以下版本的浏览器不支持 CSS3 变形,虽然 IE 有私有属性滤镜(fil ...
- CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate) 在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...
- 偏移:translate ,旋转:rotate,缩放 scale,不知道什么东东:lineCap 实例
<!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...
随机推荐
- 牛客小白月赛12 C 华华给月月出题 (积性函数,线性筛)
链接:https://ac.nowcoder.com/acm/contest/392/C 来源:牛客网 华华给月月出题 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K, ...
- libusb_bulk_transfer返回值不是0
libusb_bulk_transfer返回值不是0 libusb_bulk_transfer返回值不是0libusb_bulk_transfer返回值不是0 ?????
- 2019.09.24 Device doesn't support wireless sync
这个是flutter报错的信息: Device doesn't support wireless sync. AMDeviceStartService(device, CFSTR("com. ...
- 解决Windows jmeter Non HTTP response message: Address already in use: connect 错误(转载)
jMeter报错: Response code: Non HTTP response code: java.net.BindExceptionResponse message: Non HTTP re ...
- Javac可以编译,Java显示找不到或无法加载主类
运行时候加入完整包名.
- Image图片自适应 Image resizeMode属性
cover比较安全 cover模式只求在显示比例不失真的情况下填充整个显示区域.可以对图片进行放大或者缩小,超出显示区域的部分不显示, 也就是说,图片可能部分会显示不了.contain模式是要求显示整 ...
- Spring——代理实现AOP
一.静态代理实现 1.接口(抽象主题) 2.接口的实现类(真实主题) 3.代理类(代理主题) 4.测试类: ApplicationContext context=new ClassPathXmlApp ...
- Python3中tornado高并发框架
1.单线程tornado.web:基础web框架模块tornado.ioloop:核心IO循环模块,高效的基础.封装了:1.asyncio 协程,异步处理2. epoll模型:水平触发(状态改变就询问 ...
- Android中的“再按一次返回键退出程序”代码实现
1 用户在退出应用前给出一个提示是很有必要的,因为可能是用户并不真的想退出,而只是一不小心按下了返回键,大部分应用也是这么做的,但也有些应用的做法是在应用退出去前给出一个Dialog,我觉得这样不太友 ...
- Spring Boot教程(四十)使用Flyway来管理数据库版本
在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作.在实现这个例子的时候,我们事先在MySQL中创建了用户表.创建表的过程我们在实 ...