C语言每日一题(43)旋转链表

力扣 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

思路分析

最开始的时候我是尝试过截断法的,就是每旋转一次,就将后面的结点指向头结点并把前面的结点的指针截断置空,但后面调试发现,这只适用于旋转一次,因为旋转后,新的尾结点的前驱结点找不到了,就算实现了,时间复杂度O(n2)也挺高的。

后面我发现了一种思路,也是截断法,但不同的在于它是一次性截完,我们之前写过一题,找出链表的倒数第N个结点,比如说n=2,当我们找到了倒数第二个结点时,我们发现,该节点后面的所有结点不就是我们所需要旋转的结点吗,我们就没必要一个个截断,找到所有需要旋转的点一次性截断就行了。

关于快慢指针走的步数,题目给的值万一很大就会超出时间限制,其实我们之前写过关于字符串的旋转,当旋转次数等于字符串长度时,等于没旋转,记得将次数模一下链表长度再进循环。

复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* rotateRight(struct ListNode* head, int k) {
   struct ListNode* tail=head;//快指针
   struct ListNode* prev=head;//慢指针
   struct ListNode* cur=head;//记录链表长度
   int n=0;

   if(k==0||head==NULL||head->next==NULL)
   {
       return head;
   }
   while(cur)
   {
       n++;
       cur=cur->next;//计算链表长度

   }
   k=k%n;//记得模一下
//找需要截断的结点位置
   while(k--)
   {
       if(tail->next==NULL)
       {
           tail=head;
       }
       else
       {
           tail=tail->next;
       }
   }
   while(tail->next)
   {
       tail=tail->next;
       prev=prev->next;
   }
//截断
   tail->next=head;//将末尾结点指向头结点
   head=prev->next;//头结点移动到prev的下一个成为新头节点
   prev->next=NULL;//截断prev和tail,prev成为链表尾结点
   
   
   return head;
    
}
相关推荐
韩曙亮4 分钟前
【Web APIs】浏览器本地存储 ② ( window.sessionStorage 本地存储常用 API 简介 | 代码示例 )
开发语言·前端·javascript·localstorage·sessionstorage·web apis·浏览器本地存储
郑州光合科技余经理4 分钟前
私有化B2B订货系统实战:核心模块设计与代码实现
java·大数据·开发语言·后端·架构·前端框架·php
chillxiaohan7 分钟前
GO学习踩坑记录
开发语言·学习·golang
2301_7644413314 分钟前
python实现罗斯勒吸引子(Rössler Attractor)
开发语言·数据结构·python·算法·信息可视化
探序基因16 分钟前
R语言-使用pheatmap函数画热图
开发语言·r语言
-凌凌漆-18 分钟前
【JS】var与let的区别
开发语言·前端·javascript
ExiFengs21 分钟前
Java使用策略模式实现多实体通用操作的优雅设计
java·开发语言·设计模式·策略模式
茶本无香21 分钟前
设计模式之三—工厂模式:灵活对象创建的艺术
java·开发语言·设计模式·工厂模式
超级无敌大学霸24 分钟前
c语言整型提升
c语言·开发语言
困惑阿三28 分钟前
利用 Flexbox 实现无需媒体查询(Media Queries)的自动响应式网格。
开发语言·前端·javascript