力扣第 61 题旋转链表

news/2024/11/24 9:44:56/

题目描述

给定一个链表,旋转链表,将链表中的每个节点向右移动 k k k 个位置,其中 k k k 是非负数。

示例 1:

输入: head = [1,2,3,4,5], k = 2
输出: [4,5,1,2,3]
解释:
向右旋转 1 步: [5,1,2,3,4]
向右旋转 2 步: [4,5,1,2,3]

示例 2:

输入: head = [0,1,2], k = 4
输出: [2,0,1]
解释:
向右旋转 1 步: [2,0,1]
向右旋转 2 步: [1,2,0]
向右旋转 3 步: [0,1,2]
向右旋转 4 步: [2,0,1]

约束:

  • 链表中的节点数在范围 [ 0 , 500 ] [0, 500] [0,500] 内。
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 100Node.val100
  • 0 ≤ k ≤ 2 ∗ 1 0 9 0 \leq k \leq 2 * 10^9 0k2109

解题思路

  1. 特殊情况处理:

    • 如果链表为空或只有一个节点,或者 k = 0 k = 0 k=0,直接返回原链表
  2. 计算链表长度:

  3. 优化旋转步数:

    • 由于旋转 k k k 次相当于旋转 k % n k \% n k%n 次,减少多余计算。
  4. 找到旋转点:

    • 新的头节点的位置是 n − ( k % n ) n - (k \% n) n(k%n)。需要找到链表中对应的位置,将链表断开并重新连接。
  5. 形成环再断开:

    • 可以将链表连成环,然后在适当位置断开。

C 代码实现

以下是基于上述思路的 C 语言实现:

#include <stdio.h>
#include <stdlib.h>// 定义链表节点结构
struct ListNode {int val;struct ListNode *next;
};// 旋转链表函数
struct ListNode* rotateRight(struct ListNode* head, int k) {if (!head || !head->next || k == 0) {return head; // 特殊情况直接返回}// 计算链表长度int n = 1;struct ListNode *tail = head;while (tail->next) {tail = tail->next;n++;}// 优化 k,计算实际旋转步数k = k % n;if (k == 0) {return head; // 如果 k 为 0,不需要旋转}// 将链表连成环tail->next = head;// 找到新头节点和新尾节点int stepsToNewHead = n - k;struct ListNode *newTail = head;for (int i = 1; i < stepsToNewHead; i++) {newTail = newTail->next;}struct ListNode *newHead = newTail->next;// 断开环newTail->next = NULL;return newHead;
}// 辅助函数:创建新节点
struct ListNode* createNode(int val) {struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));newNode->val = val;newNode->next = NULL;return newNode;
}// 辅助函数:打印链表
void printList(struct ListNode* head) {while (head) {printf("%d -> ", head->val);head = head->next;}printf("NULL\n");
}// 主函数测试
int main() {// 创建链表 [1, 2, 3, 4, 5]struct ListNode *head = createNode(1);head->next = createNode(2);head->next->next = createNode(3);head->next->next->next = createNode(4);head->next->next->next->next = createNode(5);printf("原始链表: ");printList(head);int k = 2;struct ListNode *rotated = rotateRight(head, k);printf("旋转链表后: ");printList(rotated);return 0;
}

代码解析

  1. 特殊情况处理:

    • 如果链表为空、只有一个节点,或者 k = 0 k = 0 k=0,直接返回原链表,避免无意义操作。
  2. 链表长度计算:

    • 遍历链表,记录长度 n n n 并找到尾节点 tail
  3. 优化旋转步数:

    • 使用 k % n k \% n k%n 计算有效旋转次数。如果结果为 0,说明无需旋转。
  4. 形成环并找到新头:

    • 链表尾节点连接到头节点,形成环。
    • 根据 stepsToNewHead 找到新尾节点 newTail,然后确定新头节点 newHead
  5. 断开环:

    • newTail->next 设置为 NULL,完成旋转。

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
    • 遍历链表计算长度需要 O ( n ) O(n) O(n)
    • 找到新头节点需要 O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
    • 只使用了常量级的额外空间。

测试结果

输入:

head = [1,2,3,4,5], k = 2

输出:

旋转链表后: 4 -> 5 -> 1 -> 2 -> 3 -> NULL

http://www.ppmy.cn/news/1549508.html

相关文章

LLM( Large Language Models)典型应用介绍 1 -ChatGPT Large language models

ChatGPT 是基于大型语言模型&#xff08;LLM&#xff09;的人工智能应用。 GPT 全称是Generative Pre-trained Transformer。-- 生成式预训练变换模型&#xff1a; Generative&#xff08;生成式&#xff09;&#xff1a;可以根据输入生成新的文本内容&#xff0c;例如回答问题…

android 性能分析工具(03)Android Studio Profiler及常见性能图表解读

说明&#xff1a;主要解读Android Studio Profiler 和 常见性能图表。 Android Studio的Profiler工具是一套功能强大的性能分析工具集&#xff0c;它可以帮助开发者实时监控和分析应用的性能&#xff0c;包括CPU使用率、内存使用、网络活动和能耗等多个方面。以下是对Android …

应急响应靶机——linux2

载入虚拟机&#xff0c;打开虚拟机&#xff1a; 居然是没有图形化界面的那种linux&#xff0c;账户密码&#xff1a;root/Inch957821.&#xff08;注意是大写的i还有英文字符的.&#xff09; 查看虚拟机IP&#xff0c;192.168.230.10是NAT模式下自动分配的 看起来不是特别舒服&…

VSCode【下载】【安装】【汉化】【配置C++环境】【运行调试】(Windows环境)

目录 一、VSCode的下载 & 安装 二、汉化 三、配置C 一、VSCode的下载 & 安装 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/Download 注意&#xff01;&#xff01;&#xff01;【不建议下载User版本&#xff0c;下载System版本】…

【论文笔记】LoFLAT: Local Feature Matching using Focused Linear Attention Transformer

【题目】&#xff1a;LoFLAT: Local Feature Matching using Focused Linear Attention Transformer 【中文题目】&#xff1a;LoFLAT&#xff1a;使用聚焦线性注意力变换器进行局部特征匹配 【引用格式】&#xff1a;Cao N, He R, Dai Y, et al. LoFLAT: Local Feature Matc…

macOS 的目录结构

文章目录 根目录 (/)常见目录及其用途示例目录结构注意事项根目录 (/)主要目录及其含义其他目录总结 macOS 的目录结构无论是在 Intel 架构还是 ARM 架构的 Mac 电脑上都是相同的。macOS 的目录结构遵循 Unix 和 BSD 的传统&#xff0c;具有许多标准目录。以下是一些主要目录及…

GRU (门控循环单元 - 基于RNN - 简化LSTM又快又好 - 体现注意力的思想) + 代码实现 —— 笔记3.5《动手学深度学习》

目录 0. 前言 1. 门控隐状态 1.1 重置门和更新门 1.2 候选隐状态 1.3 隐状态 2. 从零开始实现 2.1 初始化模型参数 2.2 定义模型 2.3 训练与预测 3 简洁实现 4. 小结 0. 前言 课程全部代码&#xff08;pytorch版&#xff09;已上传到附件看懂上一篇RNN的所有细节&am…

【SKFramework框架核心模块】3-2、音频管理模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…