[路飞]_leetcode-61-旋转链表

简介: leetcode-61-旋转链表

网络异常,图片无法展示
|


「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战


[题目地址][B站地址]


给你一个链表的头节点 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


我们来看一下下面这张图:


网络异常,图片无法展示
|


当我们把链表连成环的时候,如果 k 为 1,我们只需要在4节点的位置把环解开,返回头节点即可


如果 k 为2,我们只需要在3节点的位置把环解开,返回头节点即可


所以本题的解题思路如下:


  1. 根据给定题意,链表可能为空,k 可能为0,所以我们要特判一下如果链表为空或者k=0,直接返回头节点即可
  2. 获取链表长度 len,如果 klen 的整数倍,那么我们其实是不需要对链表进行翻转的,否则将 klen 取余,即我们需要翻转的次数
  3. 将链表连成环
  4. 找到拆环的位置,获取拆环后的头节点,然后拆环,返回头节点即可


这里有一个问题就是我们需要在哪里拆环呢?


上面我们讲过 k 为1和2的时候我们分别需要在4节点和3节点的位置拆环,根据这个规律,我们可以得出拆环位置为之前链表的尾结点向后走 len-k 步之后的节点位置。

以下是代码实现:


var rotateRight = function(head, k) {
    // 特判
    if(head === null || k === 0) return head;
    // 获取链表长度
    let cur = head,len = 1;
    while(cur.next){
        cur = cur.next;
        len++;
    }
    // k 如果为长度整数倍,无需操作
    if(!(k %= len)) return head;
    // 连成环
    cur.next = head;
    // 找到拆环位置
    let num = len-k;
    while(num){
        cur = cur.next;
        num--;
    }
    // 拆环前拿到拆环后头节点
    const res = cur.next;
    // 拆环
    cur.next = null;
    return res;
};
复制代码


至此,我们就完成了leetcode-61-旋转链表


如有任何问题或建议,欢迎留言讨论!

相关文章
|
23天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
32 1
|
30天前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
47 0
Leetcode第21题(合并两个有序链表)
|
30天前
|
机器学习/深度学习
Leetcode第48题(旋转图像)
这篇文章介绍了LeetCode第48题“旋转图像”的解题方法,通过原地修改二维矩阵实现图像的顺时针旋转90度。
25 0
Leetcode第48题(旋转图像)
|
30天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
16 0
LeetCode第二十四题(两两交换链表中的节点)
|
30天前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
38 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
30天前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
72 0
|
30天前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
20 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
54 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
107 2