题目链接: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. 步骤1为找到单链表的尾结点,此处应用一个结点指针指向尾结点前的节点(因为要改变此结点的指向,让其指向nullptr,该结点变为尾结点);
    2. 步骤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的更多相关文章

  1. 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 ...

  2. 061 Rotate List 旋转链表

    给定一个链表,将链表向右旋转 k 个位置,其中 k 是非负数.示例:给定 1->2->3->4->5->NULL 且 k = 2,返回 4->5->1-> ...

  3. Canvas绘图之平移translate、旋转rotate、缩放scale

    画布操作介绍 画布绘图的环境通过translate(),scale(),rotate(), setTransform()和transform()来改变,它们会对画布的变换矩阵产生影响. 函数 方法 描 ...

  4. [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  ...

  5. [LeetCode] Rotate List 旋转链表

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  6. [LeetCode] Rotate Image 旋转图像

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

  7. jQuery.rotate.js参数

    CSS3 提供了多种变形效果,比如矩阵变形.位移.缩放.旋转和倾斜等等,让页面更加生动活泼有趣,不再一动不动.然后 IE10 以下版本的浏览器不支持 CSS3 变形,虽然 IE 有私有属性滤镜(fil ...

  8. CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)

    CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)   在CSS3中,可以利用transform功能来实现文字或图像的旋转.缩放.倾 ...

  9. 偏移:translate ,旋转:rotate,缩放 scale,不知道什么东东:lineCap 实例

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

随机推荐

  1. Vim——替换命令

     原创声明:本文系博主原创文章,转载或引用请注明出处. 1. 文本替换 #替换每一行的第一个a :%s/a/b/ #全部替换 :%s/a/b/g #替换/时需要转义"\/" 2. ...

  2. python+Appium自动化:id元素定位

    元素定位 与web自动化一样,app自动化元素定位也是非常重要的一环,,appium也是提供了很多元素定位的方法,比如:id.name.class.层级定位等等. 元素定位方式 id name cla ...

  3. ThinkPHP胜出Laravel 近4倍,主流框架性能测试

    主流PHP框架性能非权威测试 作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期 ...

  4. AMD 异步模块定义

    1.解决模块加载过慢 2.核心:define函数

  5. 快速取出选中checkbox的值

    原料:jquery 直接上代码 html代码 <html> <head> <title>$Title$</title> </head> &l ...

  6. Ubuntu16.04连接SSH出现 Server responded “Algorithm negotiation failed” 的解决方法

    今天安装了Ubuntu16.04虚拟机,与SSH连接时出现了如下问题 ​ 解决方法如下: (写在前面:请先确保自己已经给Ubuntu安装了SSH服务.安装方法是在root模式下,终端输入命令apt-g ...

  7. oracle数据库 ORA-01461: can bind a LONG value only for insert into a LONG column解决方案

    oracle编码分为ZHS16GBK.utf8网上很多都是说驱动包 ojdbc6 和 ojdbc14 的问题实际上在遇到这个问题是需要同时加载两个jar 分别是class12.jar和nls_char ...

  8. maven项目启动找不到org.springframework.web.context.ContextLoaderListener

    解决方法: 1. 右键单击工程项目 ->点击 properties2. 选择 Deployment Assembly3. 点击 Add -> Java Build Path Entries ...

  9. JavaWeb_(SSH论坛)_一、项目入门

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 项目已上传至gi ...

  10. 09.变态跳台阶 Java

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路 0:0 1:(1) 2:(1,1)(2) 3:(1,1,1)(2,1)( ...