21-3-27 力扣每日刷题 61. 旋转链表

  1. 旋转链表

给你一个链表的头节点 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 个节点(新头结点),然后完成基本的链接与断开与断开操作

public ListNode rotateRight(ListNode head, int k) {
        //判断不必要的旋转
        if(head== null||k==0){
            return head;
        }
        int sum=0;
        ListNode tmp=head;
        while (tmp!=null){
            sum++;
            tmp = tmp.next;
        }
        k%=sum;  //真正需要旋转的次数
        if(k==0)return head;

        //使用「快慢指针」找到倒数第 k 个节点
        ListNode slow =head;  //slow 最后会停在新头节点的前一位
        ListNode fast =head;
        while (k-- >0) fast=fast.next;
        while (fast.next!=null){
            slow=slow.next;
            fast=fast.next;
        }
        ListNode nHead = slow.next; //新头节点
        slow.next=null; //断开原来的链接
        fast.next=head; // 将新链表的前半部分(原链表的后半部分)与原链表的头结点链接上
        return  nHead;
    }

解法二:「闭合成环」

一题双解:「快慢指针」&「闭合成环」解法


此文章创于本人学习时的记录,如有错误或更优解还请指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值