力扣61.旋转链表

给你一个链表的头节点 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又可能大于链表的长度n,所以我们需要计算指针在一圈里面需要走多少,所以求得k除n的余数。因为遍历链表后,此时指针位于链表的尾部,如果此时需要向前移俩个单位,我们可以理解为:要把后面的俩个节点移到最前面。则在遍历环的时候,走到这俩个节点前,断开环,则我们可以得到目标链表。

复制代码
struct ListNode* rotateRight(struct ListNode* head, int k) {
    if(k == 0 || head == NULL || head->next ==NULL){
        return head;
    }
    int n=1;
    struct ListNode* cur = head;
    while(cur->next != NULL) {
        cur = cur->next;
        n++;
    }
    int add = n - k % n;
    if(add == n) {
        return head;
    }
    cur->next = head;//连接该链表的首尾
    while(add--) {
        cur = cur->next;
    }
    struct ListNode* prev = cur->next;
    cur->next = NULL;
    return prev;
}

总结

在最近做链表题中我觉得链表题中,应该有以下注意点

  1. 做题判断有没有特殊情况,比如该题当正整数为0或链表长度为0或1的时候,就无需判断直接返回结果即可,这会简便我们的程序。
  2. 我们要注意节点的变换和遍历链表的方式,指针的移动,如果这些无法处理好可能会导致死循环。
相关推荐
小年糕是糕手6 分钟前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
kupeThinkPoem32 分钟前
跳表有哪些算法?
数据结构·算法
前端小L41 分钟前
图论专题(二十一):并查集的“工程应用”——拔线重连,修复「连通网络」
数据结构·算法·深度优先·图论·宽度优先
88号技师1 小时前
2025年9月一区SCI-孤行尺蠖觅食优化算法Solitary Inchworm Foraging-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
前端小L1 小时前
图论专题(二十五):最小生成树(MST)——用最少的钱,连通整个世界「连接所有点的最小费用」
算法·矩阵·深度优先·图论·宽度优先
前端小L1 小时前
图论专题(二十三):并查集的“数据清洗”——解决复杂的「账户合并」
数据结构·算法·安全·深度优先·图论
CoovallyAIHub1 小时前
破局红外小目标检测:异常感知Anomaly-Aware YOLO以“俭”驭“繁”
深度学习·算法·计算机视觉
点云SLAM2 小时前
图论中邻接矩阵和邻接表详解
算法·图论·slam·邻接表·邻接矩阵·最大团·稠密图
啊董dong2 小时前
课后作业-2025年11月23号作业
数据结构·c++·算法·深度优先·noi
星释2 小时前
Rust 练习册 80:Grains与位运算
大数据·算法·rust