首页 > 编程语言 >算法题之旋转链表

算法题之旋转链表

时间:2024-08-04 16:27:34浏览次数:12  
标签:head ListNode len next 链表 算法 旋转 节点

旋转链表

给你一个链表的头节点 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个位置;也就是会把链表尾部的k个节点,依次往链表头上添加,在提示中,给出了链表值的范围,其实这个条件是无效的,因为,我们不会对链表的值进行操作,有用的条件是提示中的链表的节点数和k的取值范围。

我们确定解题思路:首先我们先将链表首尾相连,然后按照要求,依次遍历节点,截断位置。那么应该截断的位置在哪里呢?我们推导一下:

  • 如示例1,总共5个节点,向右移动2个位置;最后,链表首位是第4个节点,链表尾部是第3个节点,所以需要遍历到第5 - 2 = 3个节点作为尾部,下一个节点作为头部。
  • 如示例2,总共3个元素,向右移动4个位置,这个时候注意,移动的位置数是大于链表的长度的;如果我们移动3个位置,相当于不变,所以移动4个位置相当于是只移动了4 - 3 = 1个位置;所以需要遍历到第(3 - 4%3)= 2个节点作为尾部,下一个节点作为头部。

具体代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {

        if(head == null || head.next == null || k == 0)return head;

        int len = 0;
        ListNode node = head;

        // 遍历链表尾部
        for(len = 1; node.next != null; len++)node = node.next;
        node.next = head; // 首尾相连

        ListNode pre = head;

        for(int i = 1; i < len - k%len; i++)pre = pre.next;
        head = pre.next;
        pre.next = null;

        return head;
    }
}

复杂度分析

  • 时间复杂度:O(n),我们最少也需要遍历链表一次;最糟糕的情况下,当链表的长度n等于k+1时,我们需要遍历链表n + n - 1次。
  • 空间复杂度:O(1),我们只需要常数的空间,来存储len、node、pre即可。

标签:head,ListNode,len,next,链表,算法,旋转,节点
From: https://blog.csdn.net/qq_34149443/article/details/140906884

相关文章

  • 【机器学习算法基础】(基础机器学习课程)-11-k-means-笔记
        示例案例为了更好地理解K-Means算法,下面通过一个简单的案例进行说明。假设我们有以下10个二维数据点,表示不同商店的销售额(单位:千元)和顾客数(单位:人):[(10,100),(20,80),(30,70),(40,60),(50,50),(60,40),(70,30),(80,20),(90,10),(......
  • KMP 算法学习笔记
    问题引入给出两个字符串\(s1\)和\(s2\),求出\(s2\)在\(s1\)中所有出现的位置(出现指\(s1\)中存在子串与\(s2\)完全相同)。朴素暴力不详细介绍,容易发现时间复杂度不优秀。KMP算法思想在朴素暴力中我们可以发现有很多匹配是不需要再次从头开始重新匹配的,举个例子:ABA......
  • 寻求 Kadane 求连续子数组最大和的算法的优化和验证
    在此处输入图像描述给定一个由N个整数组成的数组A。您希望将数组划分为不相交的连续子数组以使其良好。如果满足以下条件,则认为数组是好的数组:每个元素恰好属于一个子数组。如果我们将每个子数组替换为子数组值的MEX(排除最小值),则生成的数组将按非降序......
  • Java计算机毕业设计基于协同过滤算法的音乐推荐系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,音乐作为人们日常生活中不可或缺的一部分,其获取方式也经历了从实体唱片到数字音乐的巨大变革。面对海量的音乐资源和日益个......
  • Java计算机毕业设计基于协同过滤算法的体育用品推荐系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的迅猛发展,电子商务已成为人们购物的主要渠道之一,体育用品市场也不例外。然而,面对海量的体育用品信息和多样化的用户需求,如何高效、精准地......
  • 秒懂斐波那契:算法优化实现21亿级速度突破
    针对斐波那契数列算法进行详细介绍和优化,从最简单的递归方法到更高效的迭代、缓存、动态规划、公式推导和矩阵解法,最终达到了时间复杂度为O(logn)的快速幂矩阵解法来感受算法的神奇之处,最后可以看到如何实现在输入n=2100000000(21亿)时仅耗时0.02毫秒的最佳效果。一、回顾斐波......
  • DLMS/COSEM中的信息安全:加密算法(中)1
    3.3高级加密标准    为了DLMS/COSEM的目的,应使用FIPSPUB197:2001中规定的高级加密标准(AES)。AES在加密或解密操作期间对数据块(块)进行操作。因此,AES被称为分组密码算法。    AES使用128、192或256位密钥以128位数据块加密和解密数据。三个密钥大小是足够的。......
  • Java常用类和数据结构与算法
    1.其他常用类1.1.Math类java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值一般为double型。如果需要更加强大的数学运算能力,可以使用apachecommons下面的Math类库publicclassTestMath{publicstaticvoidmain(String[]args){S......
  • 2.面试算法-数组之基础过关题
    1.基础过关题1.1数组问题常用思想1.1.1双指针思想我们前面说过数组里的元素是紧紧靠在一起的,不能有空隙,后面的元素就要整体向前移动,同样如果在中间位置插入元素,那么其后的元素都要整体向后移动。很多算法问题需要多次反复移动,比如说连续删除多个元素,这就导致会频繁大......
  • 算法力扣刷题记录 六十四【216.组合总和III】
    前言回溯第二篇。回顾:上一篇学了回溯的基础知识和模版;组合练习题一应用了一次模版。本文继续组合问题练习:记录六十四【216.组合总和III】。一、题目阅读找出所有相加之和为n的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回所有可能的有效......