首页 > 其他分享 >leetcode61:旋转链表

leetcode61:旋转链表

时间:2024-12-11 10:31:33浏览次数:3  
标签:leetcode61 head k% ArrayList 旋转 链表 节点

原题地址:61. 旋转链表 - 力扣(LeetCode)

题目描述

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

解题思路

  1. 明确旋转规则

    • 每次旋转,将链表的最后一个节点移到链表头部。
    • 如果 kk 大于链表长度,实际旋转次数为 k%链表长度k%链表长度。
  2. 处理边界条件

    • 链表为空,单节点,或 k=0k=0:直接返回原链表。
    • kk 为链表长度的倍数时,旋转后链表不变。
  3. 实现方案

    • 使用一个 ArrayList 将链表节点存储起来,方便操作和索引。
    • 循环 k%链表长度k%链表长度 次,每次从尾部移除一个节点,将其插入到头部。
    • 最终返回列表的第一个节点作为新的链表头。

源码实现

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        // 边界条件判断
        if (null == head || head.next == null || k == 0) {
            return head; // 空链表、单节点链表或无需旋转时,直接返回原链表
        }

        // 使用 ArrayList 存储链表节点
        List<ListNode> nodeList = new ArrayList<>();
        ListNode node = head;
        while (null != node) { // 遍历链表并存储每个节点
            nodeList.add(node);
            node = node.next;
        }

        // 链表长度
        int length = 0;
        if (k <= nodeList.size()) {
            length = k; // 当 k 小于等于链表长度时,旋转次数等于 k
        } else {
            // 当 k 大于链表长度时,旋转次数取 k % 链表长度
            length = k % nodeList.size() == 0 ? nodeList.size() : k % nodeList.size();
        }

        // 执行旋转操作
        for (int i = 0; i < length; i++) {
            int index = nodeList.size() - 1; // 当前链表的最后一个节点索引
            ListNode prev = nodeList.get(index - 1); // 倒数第二个节点
            ListNode curr = nodeList.get(index); // 最后一个节点

            // 移动最后一个节点到头部
            nodeList.remove(index); // 移除最后一个节点
            prev.next = null; // 将倒数第二个节点设置为尾节点
            curr.next = nodeList.get(0); // 最后一个节点指向原链表头部
            nodeList.add(0, curr); // 将最后一个节点插入到列表头部
        }

        // 返回新链表头节点
        return nodeList.get(0);
    }
}

复杂度分析

  1. 时间复杂度

    • 遍历链表并存储节点到 ArrayList:O(n)O(n),其中 nn 是链表长度。
    • 每次旋转操作:
      • 从 ArrayList 中移除尾节点和插入头部操作为 O(1)O(1)。
      • 循环 k%nk%n 次,最坏情况下 k=nk=n,最多旋转 nn 次。
    • 总时间复杂度:O(n+k%n)O(n+k%n),在最坏情况下为 O(2n)O(2n)
  2. 空间复杂度

    • 使用了一个 ArrayList 存储链表节点,空间复杂度为 O(n)O(n)。
    • 总空间复杂度:O(n)O(n)

标签:leetcode61,head,k%,ArrayList,旋转,链表,节点
From: https://blog.csdn.net/qq_36070104/article/details/144393356

相关文章

  • 大数据-247 离线数仓 - 电商分析 拉链表的分析与构建与回滚
    点一下关注吧!!!非常感谢!!持续更新!!!Java篇开始了!目前开始更新MyBatis,一起深入浅出!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(......
  • 双向链表容器
    C++中的list是一个双向链表容器,用于存储一系列的元素。它提供了在任意位置插入和删除元素的能力,同时还支持随机访问。在C++中,list是由标准模板库(STL)提供的容器之一。它位于<list>头文件中,并且通过std命名空间进行访问。创建一个list对象非常简单,只需声明一个list变量并指定元......
  • [转]旋转矩阵:点旋转和坐标系旋转
    点旋转坐标系旋转总结原文链接:旋转矩阵:点旋转和坐标系旋转......
  • 数据结构:单链表
                                ......
  • android 12 (1、屏幕旋转默认开启 (2、Font size 保持微 Largest 选项设置 (3、Font s
    —a/alps/frameworks/base/core/java/android/content/res/Configuration.java+++b/alps/frameworks/base/core/java/android/content/res/Configuration.java@@-1422,7+1422,7@@publicfinalclassConfigurationimplementsParcelable,Comparable<Configuration......
  • jQuery和CSS3炫酷3D旋转画廊特效插件
    这是一款效果非常炫酷的jQuery和CSS33D旋转画廊特效插件。第一个DEMO是一个简单的例子,使用CSS3来制作3d旋转效果,然后用js来控制前后导航按钮。第二个DEMO是第一个DEMO的升级版,它增加了图片标题、查看图片、键盘控制等其它功能。在线演示下载 HTML结构这个3D画廊的HTML结......
  • 弹性波动力学笔记(一) 旋转矩阵简介
    IntroductionofRotationTransformationAndRotationMatrix1.1SummaryofvectoranalysisAvectorisdefinedasadirectedlinesegment,havingbothmagnitudeanddirection.Themagnitude,orlength,ofavectorawillberepresentedby\(|\math......
  • 大数据-246 离线数仓 - 电商分析 拉链表的分析与构建与回滚
    点一下关注吧!!!非常感谢!!持续更新!!!Java篇开始了!目前开始更新MyBatis,一起深入浅出!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(......
  • 华为编程-合并两个有序链表
    题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。例如下图:解法一(指针迭代思想):除了输入的两个链表指针l1和l2之外,再定义四个指针,分别为current1、current2、final和current_final。其中current1和current2为链表一......
  • C++链表的创建与基本操作
    在C++中,链表是一种动态数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表具有灵活的内存管理和高校的插入与删除操作,但访问效率较低。链表的每个节点通常包含两部分:1、数据部分(存储链表中元素的数据);2、指针部分(指向链表中的下一个节点)。链表类型主......