Leetcode61 旋转链表 中等

本文深入探讨了旋转链表算法的实现思路,通过将链表转换为环状结构,找到新头结点的规律,从而高效地完成链表的旋转。文章详细解释了如何计算新头结点的位置,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
在这里插入图片描述
思路:
仔细思考后旋转链表其实就相当于链表有个环,旋转后改变了头结点而已。
接下来可以找到一个关系,以题目示例1为例
假设5的next-1,也就是有一个环,那么移动后的头结点有什么规律
移动1,新头结点=倒数第一个=正数第5个
移动2,新头结点=倒数第二个=正数第4个
移动3,新头结点=倒数第三个=正数第3个
移动4,新头结点=倒数第四个=正数第2个
移动5=没移动
可以发现,新头结点=原链表正数第(链表长-移动步数+1)个
那么只需要头结点正向移动(链表长-移动步数)个就能到达新头结点

总结:

  1. 先修改链表成环
  2. 计算新头结点=正向移动多少步
  3. 把环撤销

代码:

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null){
            return null;
        }
        int len = 1;
        //pHead是辅助指针,接下来进行重复使用,不再新建额外ListNode对象
        ListNode pHead = head;
        //计算链表长
        while(pHead.next != null){
            len++;
            pHead = pHead.next;
        }
        //计算要移动多少步,对链表长求余即可,避免不必要的移动,减少移动次数
        int move = k % len;
        if(move == 0){
            return head;
        }
        //修改链表成环
        pHead.next = head;
        ListNode newHead;
        pHead = head;
        int moveCount = len-(move-1)-1;
        //找新头结点
        while(moveCount > 0){
            pHead = pHead.next;
            moveCount--;
        }
        newHead = pHead;
        len--;
        //移动len-1步到达末尾,把环去掉
        while(len > 0){
            pHead = pHead.next;
            len--;
        }
        pHead.next = null;
        return newHead;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值